src/HOL/Isar_examples/NestedDatatype.thy
author berghofe
Fri, 11 Jul 2003 14:55:17 +0200
changeset 14102 8af7334af4b3
parent 11809 c9ffdd63dd93
child 16417 9bc16273c2d4
permissions -rw-r--r--
- Installed specific code generator for equality enforcing that arguments do not have function types, which would result in an error message during compilation. - Added test case generators for basic types.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     1
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
     2
header {* Nested datatypes *}
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     3
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
     4
theory NestedDatatype = Main:
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     5
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
     6
subsection {* Terms and substitution *}
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     7
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     8
datatype ('a, 'b) "term" =
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
     9
    Var 'a
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    10
  | App 'b "('a, 'b) term list"
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    11
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    12
consts
8717
20c42415c07d plain ASCII;
wenzelm
parents: 8676
diff changeset
    13
  subst_term :: "('a => ('a, 'b) term) => ('a, 'b) term => ('a, 'b) term"
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    14
  subst_term_list ::
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    15
    "('a => ('a, 'b) term) => ('a, 'b) term list => ('a, 'b) term list"
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    16
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    17
primrec (subst)
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    18
  "subst_term f (Var a) = f a"
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    19
  "subst_term f (App b ts) = App b (subst_term_list f ts)"
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    20
  "subst_term_list f [] = []"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    21
  "subst_term_list f (t # ts) = subst_term f t # subst_term_list f ts"
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    22
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    23
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    24
text {*
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    25
 \medskip A simple lemma about composition of substitutions.
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    26
*}
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    27
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    28
lemma
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    29
   "subst_term (subst_term f1 o f2) t =
8717
20c42415c07d plain ASCII;
wenzelm
parents: 8676
diff changeset
    30
      subst_term f1 (subst_term f2 t) &
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    31
    subst_term_list (subst_term f1 o f2) ts =
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    32
      subst_term_list f1 (subst_term_list f2 ts)"
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    33
  by (induct t and ts) simp_all
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    34
9659
wenzelm
parents: 8717
diff changeset
    35
lemma "subst_term (subst_term f1 o f2) t =
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    36
  subst_term f1 (subst_term f2 t)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    37
proof -
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    38
  let "?P t" = ?thesis
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    39
  let ?Q = "\<lambda>ts. subst_term_list (subst_term f1 o f2) ts =
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    40
    subst_term_list f1 (subst_term_list f2 ts)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    41
  show ?thesis
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    42
  proof (induct t)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    43
    fix a show "?P (Var a)" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    44
  next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    45
    fix b ts assume "?Q ts"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    46
    thus "?P (App b ts)" by (simp add: o_def)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    47
  next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    48
    show "?Q []" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    49
  next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    50
    fix t ts
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    51
    assume "?P t" "?Q ts" thus "?Q (t # ts)" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    52
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    53
qed
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    54
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    55
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    56
subsection {* Alternative induction *}
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    57
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    58
theorem term_induct' [case_names Var App]:
9659
wenzelm
parents: 8717
diff changeset
    59
  "(!!a. P (Var a)) ==>
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    60
   (!!b ts. list_all P ts ==> P (App b ts)) ==> P t"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    61
proof -
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    62
  assume var: "!!a. P (Var a)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    63
  assume app: "!!b ts. list_all P ts ==> P (App b ts)"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    64
  show ?thesis
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    65
  proof (induct t)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    66
    fix a show "P (Var a)" by (rule var)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    67
  next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    68
    fix b t ts assume "list_all P ts"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    69
    thus "P (App b ts)" by (rule app)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    70
  next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    71
    show "list_all P []" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    72
  next
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    73
    fix t ts assume "P t" "list_all P ts"
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    74
    thus "list_all P (t # ts)" by simp
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    75
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    76
qed
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    77
8717
20c42415c07d plain ASCII;
wenzelm
parents: 8676
diff changeset
    78
lemma
20c42415c07d plain ASCII;
wenzelm
parents: 8676
diff changeset
    79
  "subst_term (subst_term f1 o f2) t = subst_term f1 (subst_term f2 t)"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    80
  (is "?P t")
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    81
proof (induct t rule: term_induct')
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    82
  case (Var a)
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    83
  show "?P (Var a)" by (simp add: o_def)
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    84
next
11809
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    85
  case (App b ts)
c9ffdd63dd93 tuned induction proofs;
wenzelm
parents: 10458
diff changeset
    86
  thus "?P (App b ts)" by (induct ts) simp_all
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    87
qed
8676
4bf18b611a75 added NestedDatatype.thy;
wenzelm
parents:
diff changeset
    88
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9659
diff changeset
    89
end