src/ZF/ex/Term.ML
author lcp
Tue, 26 Jul 1994 14:02:16 +0200
changeset 486 6b58082796f6
parent 477 53fc8ad84b33
child 515 abcc438e7c27
permissions -rw-r--r--
Misc minor updates
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
486
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
     1
(*  Title: 	ZF/ex/Term.ML
0
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
486
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
     4
    Copyright   1994  University of Cambridge
0
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
486
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    11
 (val thy	= List.thy;
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    12
  val thy_name	= "Term";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
  val rec_specs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
      [("term", "univ(A)",
445
7b6d8b8d4580 changed syntax of datatype declaration
clasohm
parents: 434
diff changeset
    15
	  [(["Apply"], "[i,i]=>i", NoSyn)])];
486
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    16
  val rec_styp	= "i=>i";
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    17
  val sintrs	= ["[| a: A;  l: list(term(A)) |] ==> Apply(a,l) : term(A)"];
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    18
  val monos	= [list_mono];
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    19
  val type_intrs = (list_univ RS subsetD) :: datatype_intrs;
6b58082796f6 Misc minor updates
lcp
parents: 477
diff changeset
    20
  val type_elims = []);
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
434
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    24
goal Term.thy "term(A) = A * list(term(A))";
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    25
by (rtac (Term.unfold RS trans) 1);
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    26
bws Term.con_defs;
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    27
by (fast_tac (sum_cs addIs ([equalityI] @ datatype_intrs)
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    28
 	             addDs [Term.dom_subset RS subsetD]
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    29
 	             addEs [A_into_univ, list_into_univ]) 1);
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    30
val term_unfold = result();
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    31
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
(*Induction on term(A) followed by induction on List *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
val major::prems = goal Term.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
    "[| t: term(A);  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
\       !!x.      [| x: A |] ==> P(Apply(x,Nil));  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
\       !!x z zs. [| x: A;  z: term(A);  zs: list(term(A));  P(Apply(x,zs))  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
\                 |] ==> P(Apply(x, Cons(z,zs)))  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
\    |] ==> P(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
by (rtac (major RS Term.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
by (etac List.induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
by (etac CollectE 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
by (REPEAT (ares_tac (prems@[list_CollectD]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
val term_induct2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
(*Induction on term(A) to prove an equation*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
val major::prems = goal (merge_theories(Term.thy,ListFn.thy))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
    "[| t: term(A);  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
\       !!x zs. [| x: A;  zs: list(term(A));  map(f,zs) = map(g,zs) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
\               f(Apply(x,zs)) = g(Apply(x,zs))  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
\    |] ==> f(t)=g(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by (rtac (major RS Term.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
by (resolve_tac prems 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
by (REPEAT (eresolve_tac [asm_rl, map_list_Collect, list_CollectD] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
val term_induct_eqn = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
(**  Lemmas to justify using "term" in other recursive type definitions **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
goalw Term.thy Term.defs "!!A B. A<=B ==> term(A) <= term(B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (rtac lfp_mono 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by (REPEAT (rtac Term.bnd_mono 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
by (REPEAT (ares_tac (univ_mono::basic_monos) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
val term_mono = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
(*Easily provable by induction also*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
goalw Term.thy (Term.defs@Term.con_defs) "term(univ(A)) <= univ(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
by (rtac lfp_lowerbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
by (rtac (A_subset_univ RS univ_mono) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
by (safe_tac ZF_cs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
by (REPEAT (ares_tac [Pair_in_univ, list_univ RS subsetD] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
val term_univ = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
434
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    72
val term_subset_univ = 
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    73
    term_mono RS (term_univ RSN (2,subset_trans)) |> standard;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
434
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    75
goal Term.thy "!!t A B. [| t: term(A);  A <= univ(B) |] ==> t: univ(B)";
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    76
by (REPEAT (ares_tac [term_subset_univ RS subsetD] 1));
89d45187f04d Various updates and tidying
lcp
parents: 71
diff changeset
    77
val term_into_univ = result();