src/ZF/ex/tf.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 56 2caa6f49f06e
permissions -rw-r--r--
Initial revision
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
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
 (val thy = Univ.thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
  val rec_specs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
      [("tree", "univ(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
	  [(["Tcons"],	"[i,i]=>i")]),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
       ("forest", "univ(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
	  [(["Fnil"],	"i"),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
	   (["Fcons"],	"[i,i]=>i")])];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  val rec_styp = "i=>i";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
  val ext = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
  val sintrs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
	  ["[| a:A;  tf: forest(A) |] ==> Tcons(a,tf) : tree(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
	   "Fnil : forest(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
	   "[| t: tree(A);  tf: forest(A) |] ==> Fcons(t,tf) : forest(A)"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
  val monos = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
  val type_intrs = data_typechecks
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
  val type_elims = []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
val [TconsI, FnilI, FconsI] = TF.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
(** tree_forest(A) as the union of tree(A) and forest(A) **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
goalw TF.thy (tl TF.defs) "tree(A) <= tree_forest(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
by (rtac Part_subset 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
val tree_subset_TF = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
goalw TF.thy (tl TF.defs) "forest(A) <= tree_forest(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
by (rtac Part_subset 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
val forest_subset_TF = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
goalw TF.thy (tl TF.defs) "tree(A) Un forest(A) = tree_forest(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
by (rtac (TF.dom_subset RS Part_sum_equality) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
val TF_equals_Un = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
(** NOT useful, but interesting... **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
goalw TF.thy (tl TF.defs) "tree(A) = {Inl(x). x: A*forest(A)}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
by (res_inst_tac [("P", "%x.?t(x) = ?u::i")] (TF.unfold RS ssubst) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
by (rewrite_goals_tac TF.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
by (rtac equalityI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
by (fast_tac (ZF_cs addIs [PartI] addSEs (PartE::TF.free_SEs)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
by (fast_tac (ZF_cs addIs ([PartI,InlI,InrI] @ [TF.dom_subset RS subsetD]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
			   @ data_typechecks)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
	            addSEs (PartE::TF.free_SEs)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
val tree_unfold = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
goalw TF.thy (tl TF.defs) "forest(A) = {Inr(x). x: {0} + tree(A)*forest(A)}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
by (res_inst_tac [("P", "%x.?t(x) = ?u::i")] (TF.unfold RS ssubst) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
by (rewrite_goals_tac TF.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
by (rtac equalityI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (fast_tac (ZF_cs addIs [PartI,InlI,InrI] 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
                    addSEs (PartE::TF.free_SEs)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
by (fast_tac (ZF_cs addIs ([PartI,InlI,InrI] @ [TF.dom_subset RS subsetD]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
			   @ data_typechecks)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
	            addSEs ([PartE, sumE] @ TF.free_SEs)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
val forest_unfold = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65