src/ZF/ex/term.ML
author nipkow
Mon, 06 Dec 1993 17:05:10 +0100
changeset 189 831a9a7ab9f3
parent 71 729fe026c5f3
permissions -rw-r--r--
added rep_tsig
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/term.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
Datatype definition of terms over an alphabet.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
Illustrates the list functor (essentially the same type as in Trees & Forests)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
structure Term = Datatype_Fun
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
 (val thy = List.thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
  val rec_specs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
      [("term", "univ(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
	  [(["Apply"], "[i,i]=>i")])];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
  val rec_styp = "i=>i";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  val ext = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  val sintrs = ["[| a: A;  l: list(term(A)) |] ==> Apply(a,l) : term(A)"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
  val monos = [list_mono];
71
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    19
  val type_intrs = datatype_intrs;
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 16
diff changeset
    20
  val type_elims = [make_elim (list_univ RS subsetD)]);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
val [ApplyI] = Term.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
(*Induction on term(A) followed by induction on List *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
val major::prems = goal Term.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
    "[| t: term(A);  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
\       !!x.      [| x: A |] ==> P(Apply(x,Nil));  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
\       !!x z zs. [| x: A;  z: term(A);  zs: list(term(A));  P(Apply(x,zs))  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
\                 |] ==> P(Apply(x, Cons(z,zs)))  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
\    |] ==> P(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
by (rtac (major RS Term.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
by (etac List.induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
by (etac CollectE 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
by (REPEAT (ares_tac (prems@[list_CollectD]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
val term_induct2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
(*Induction on term(A) to prove an equation*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
val major::prems = goal (merge_theories(Term.thy,ListFn.thy))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
    "[| t: term(A);  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
\       !!x zs. [| x: A;  zs: list(term(A));  map(f,zs) = map(g,zs) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
\               f(Apply(x,zs)) = g(Apply(x,zs))  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
\    |] ==> f(t)=g(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
by (rtac (major RS Term.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
by (resolve_tac prems 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
by (REPEAT (eresolve_tac [asm_rl, map_list_Collect, list_CollectD] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
val term_induct_eqn = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
(**  Lemmas to justify using "term" in other recursive type definitions **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
goalw Term.thy Term.defs "!!A B. A<=B ==> term(A) <= term(B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by (rtac lfp_mono 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
by (REPEAT (rtac Term.bnd_mono 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
by (REPEAT (ares_tac (univ_mono::basic_monos) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
val term_mono = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
(*Easily provable by induction also*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
goalw Term.thy (Term.defs@Term.con_defs) "term(univ(A)) <= univ(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
by (rtac lfp_lowerbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (rtac (A_subset_univ RS univ_mono) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by (safe_tac ZF_cs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
by (REPEAT (ares_tac [Pair_in_univ, list_univ RS subsetD] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
val term_univ = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
val term_subset_univ = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
    (term_mono RS (term_univ RSN (2,subset_trans)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66