src/ZF/ex/tf.ML
author lcp
Thu, 17 Mar 1994 12:36:58 +0100
changeset 279 7738aed3f84d
parent 77 c94c8ebc0b15
permissions -rw-r--r--
Improved layout for inductive defs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/tf.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Trees & forests, a mutually recursive type definition.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
structure TF = Datatype_Fun
279
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    10
 (val thy        = Univ.thy
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    11
  val rec_specs  = [("tree", "univ(A)",
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    12
                       [(["Tcons"],  "[i,i]=>i")]),
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    13
                    ("forest", "univ(A)",
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    14
                       [(["Fnil"],   "i"),
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    15
                        (["Fcons"],  "[i,i]=>i")])]
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    16
  val rec_styp   = "i=>i"
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    17
  val ext        = None
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    18
  val sintrs     = 
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    19
          ["[| a:A;  f: forest(A) |] ==> Tcons(a,f) : tree(A)",
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    20
           "Fnil : forest(A)",
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    21
           "[| t: tree(A);  f: forest(A) |] ==> Fcons(t,f) : forest(A)"]
7738aed3f84d Improved layout for inductive defs
lcp
parents: 77
diff changeset
    22
  val monos      = []
71
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    23
  val type_intrs = datatype_intrs
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    24
  val type_elims = datatype_elims);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
val [TconsI, FnilI, FconsI] = TF.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
(** tree_forest(A) as the union of tree(A) and forest(A) **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
goalw TF.thy (tl TF.defs) "tree(A) <= tree_forest(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
by (rtac Part_subset 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
val tree_subset_TF = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
goalw TF.thy (tl TF.defs) "forest(A) <= tree_forest(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
by (rtac Part_subset 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
val forest_subset_TF = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
goalw TF.thy (tl TF.defs) "tree(A) Un forest(A) = tree_forest(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
by (rtac (TF.dom_subset RS Part_sum_equality) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
val TF_equals_Un = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
(** NOT useful, but interesting... **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    44
(*The (refl RS conjI RS exI RS exI) avoids considerable search!*)
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    45
val unfold_cs = sum_cs addSIs [PartI, refl RS conjI RS exI RS exI]
71
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    46
                    addIs datatype_intrs
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    47
                    addDs [TF.dom_subset RS subsetD]
71
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    48
	            addSEs ([PartE] @ datatype_elims @ TF.free_SEs);
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    49
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
goalw TF.thy (tl TF.defs) "tree(A) = {Inl(x). x: A*forest(A)}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by (res_inst_tac [("P", "%x.?t(x) = ?u::i")] (TF.unfold RS ssubst) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
by (rewrite_goals_tac TF.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
by (rtac equalityI 1);
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    54
by (fast_tac unfold_cs 1);
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    55
by (fast_tac unfold_cs 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
val tree_unfold = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
goalw TF.thy (tl TF.defs) "forest(A) = {Inr(x). x: {0} + tree(A)*forest(A)}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (res_inst_tac [("P", "%x.?t(x) = ?u::i")] (TF.unfold RS ssubst) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by (rewrite_goals_tac TF.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
by (rtac equalityI 1);
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    62
by (fast_tac unfold_cs 1);
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 0
diff changeset
    63
by (fast_tac unfold_cs 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
val forest_unfold = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65