src/HOL/Isar_Examples/Nested_Datatype.thy
author wenzelm
Wed, 10 Jun 2015 17:22:35 +0200
changeset 60416 e1ff959f4f1b
parent 58882 6e2010ab8bd9
child 60449 229bad93377e
permissions -rw-r--r--
tuned proofs;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58882
6e2010ab8bd9 modernized header;
wenzelm
parents: 58614
diff changeset
     1
section \<open>Nested datatypes\<close>
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     2
31758
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 23373
diff changeset
     3
theory Nested_Datatype
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 23373
diff changeset
     4
imports Main
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 23373
diff changeset
     5
begin
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     6
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
     7
subsection \<open>Terms and substitution\<close>
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     8
58310
91ea607a34d8 updated news
blanchet
parents: 58260
diff changeset
     9
datatype ('a, 'b) "term" =
55656
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    10
  Var 'a
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    11
| App 'b "('a, 'b) term list"
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    12
55656
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    13
primrec subst_term :: "('a \<Rightarrow> ('a, 'b) term) \<Rightarrow> ('a, 'b) term \<Rightarrow> ('a, 'b) term"
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    14
  and subst_term_list :: "('a \<Rightarrow> ('a, 'b) term) \<Rightarrow> ('a, 'b) term list \<Rightarrow> ('a, 'b) term list"
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 37597
diff changeset
    15
where
37597
a02ea93e88c6 modernized specifications
haftmann
parents: 33026
diff changeset
    16
  "subst_term f (Var a) = f a"
a02ea93e88c6 modernized specifications
haftmann
parents: 33026
diff changeset
    17
| "subst_term f (App b ts) = App b (subst_term_list f ts)"
a02ea93e88c6 modernized specifications
haftmann
parents: 33026
diff changeset
    18
| "subst_term_list f [] = []"
a02ea93e88c6 modernized specifications
haftmann
parents: 33026
diff changeset
    19
| "subst_term_list f (t # ts) = subst_term f t # subst_term_list f ts"
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    20
58260
c96e511bfb79 ported Isar_Examples to new datatypes
blanchet
parents: 58249
diff changeset
    21
lemmas subst_simps = subst_term.simps subst_term_list.simps
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    22
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
    23
text \<open>\medskip A simple lemma about composition of substitutions.\<close>
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    24
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 37597
diff changeset
    25
lemma
55656
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    26
  "subst_term (subst_term f1 \<circ> f2) t =
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 37597
diff changeset
    27
    subst_term f1 (subst_term f2 t)"
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 37597
diff changeset
    28
  and
55656
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    29
  "subst_term_list (subst_term f1 \<circ> f2) ts =
37671
fa53d267dab3 misc tuning and modernization;
wenzelm
parents: 37597
diff changeset
    30
    subst_term_list f1 (subst_term_list f2 ts)"
58260
c96e511bfb79 ported Isar_Examples to new datatypes
blanchet
parents: 58249
diff changeset
    31
  by (induct t and ts rule: subst_term.induct subst_term_list.induct) simp_all
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    32
58260
c96e511bfb79 ported Isar_Examples to new datatypes
blanchet
parents: 58249
diff changeset
    33
lemma "subst_term (subst_term f1 \<circ> f2) t = subst_term f1 (subst_term f2 t)"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    34
proof -
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    35
  let "?P t" = ?thesis
55656
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    36
  let ?Q = "\<lambda>ts. subst_term_list (subst_term f1 \<circ> f2) ts =
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    37
    subst_term_list f1 (subst_term_list f2 ts)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    38
  show ?thesis
58260
c96e511bfb79 ported Isar_Examples to new datatypes
blanchet
parents: 58249
diff changeset
    39
  proof (induct t rule: subst_term.induct)
60416
e1ff959f4f1b tuned proofs;
wenzelm
parents: 58882
diff changeset
    40
    show "?P (Var a)" for a by simp
e1ff959f4f1b tuned proofs;
wenzelm
parents: 58882
diff changeset
    41
    show "?P (App b ts)" if "?Q ts" for b ts
e1ff959f4f1b tuned proofs;
wenzelm
parents: 58882
diff changeset
    42
      using prems by (simp only: subst_simps)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    43
    show "?Q []" by simp
60416
e1ff959f4f1b tuned proofs;
wenzelm
parents: 58882
diff changeset
    44
    show "?Q (t # ts)" if "?P t" "?Q ts" for t ts
e1ff959f4f1b tuned proofs;
wenzelm
parents: 58882
diff changeset
    45
      using prems by (simp only: subst_simps)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    46
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    47
qed
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    48
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    49
58614
7338eb25226c more cartouches;
wenzelm
parents: 58310
diff changeset
    50
subsection \<open>Alternative induction\<close>
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    51
55656
eb07b0acbebc more symbols;
wenzelm
parents: 37671
diff changeset
    52
lemma "subst_term (subst_term f1 \<circ> f2) t = subst_term f1 (subst_term f2 t)"
58260
c96e511bfb79 ported Isar_Examples to new datatypes
blanchet
parents: 58249
diff changeset
    53
proof (induct t rule: term.induct)
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    54
  case (Var a)
18153
a084aa91f701 tuned proofs;
wenzelm
parents: 16417
diff changeset
    55
  show ?case by (simp add: o_def)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    56
next
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    57
  case (App b ts)
23373
ead82c82da9e tuned proofs: avoid implicit prems;
wenzelm
parents: 18460
diff changeset
    58
  then show ?case by (induct ts) simp_all
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    59
qed
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    60
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    61
end