ex/Term.ML
author lcp
Thu, 18 Aug 1994 12:48:03 +0200
changeset 114 b7f57e0ab47c
parent 48 21291189b51e
child 127 d9527f97246e
permissions -rw-r--r--
HOL/ex/Term, Simult: updated for new Split
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	HOL/ex/term
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     6
For term.thy.  illustrates List functor
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
  (essentially the same type as in Trees & Forests)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     9
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
open Term;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    11
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
(*** Monotonicity and unfolding of the function ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    13
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
goal Term.thy "mono(%Z.  A <*> List(Z))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
by (REPEAT (ares_tac [monoI, subset_refl, List_mono, uprod_mono] 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
val Term_fun_mono = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    17
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
val Term_unfold = Term_fun_mono RS (Term_def RS def_lfp_Tarski);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    19
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    20
(*This justifies using Term in other recursive type definitions*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    21
goalw Term.thy [Term_def] "!!A B. A<=B ==> Term(A) <= Term(B)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    22
by (REPEAT (ares_tac [lfp_mono, subset_refl, List_mono, uprod_mono] 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
val Term_mono = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    24
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    25
(** Type checking rules -- Term creates well-founded sets **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    26
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    27
val prems = goalw Term.thy [Term_def] "Term(Sexp) <= Sexp";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    28
by (rtac lfp_lowerbound 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    29
by (fast_tac (univ_cs addIs [Sexp_SconsI, List_Sexp RS subsetD]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    30
val Term_Sexp = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    32
(* A <= Sexp ==> Term(A) <= Sexp *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
val Term_subset_Sexp = standard
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
    (Term_mono RS (Term_Sexp RSN (2,subset_trans)));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    35
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    36
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
(** Elimination -- structural induction on the set Term(A) **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    38
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    39
(*Induction for the set Term(A) *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    40
val [major,minor] = goal Term.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    41
    "[| M: Term(A);  \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    42
\       !!x zs. [| x: A;  zs: List(Term(A));  zs: List({x.R(x)}) \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    43
\               |] ==> R(x$zs)  \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    44
\    |] ==> R(M)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    45
by (rtac (major RS (Term_def RS def_induct)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    46
by (rtac Term_fun_mono 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    47
by (REPEAT (eresolve_tac ([uprodE, ssubst, minor] @
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    48
 		([Int_lower1,Int_lower2] RL [List_mono RS subsetD])) 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    49
val Term_induct = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    50
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    51
(*Induction on Term(A) followed by induction on List *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    52
val major::prems = goal Term.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    53
    "[| M: Term(A);  \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    54
\       !!x.      [| x: A |] ==> R(x$NIL);  \
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    55
\       !!x z zs. [| x: A;  z: Term(A);  zs: List(Term(A));  R(x$zs)  \
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    56
\                 |] ==> R(x $ CONS(z,zs))  \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
\    |] ==> R(M)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
by (rtac (major RS Term_induct) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    59
by (etac List_induct 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    60
by (REPEAT (ares_tac prems 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    61
val Term_induct2 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    62
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    63
(*** Structural Induction on the abstract type 'a term ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    64
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    65
val list_all_ss = map_ss addsimps [list_all_Nil, list_all_Cons];
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    66
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    67
val Rep_Term_in_Sexp =
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    68
    Rep_Term RS (range_Leaf_subset_Sexp RS Term_subset_Sexp RS subsetD);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    69
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    70
(*Induction for the abstract type 'a term*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    71
val prems = goalw Term.thy [App_def,Rep_TList_def,Abs_TList_def]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    72
    "[| !!x ts. list_all(R,ts) ==> R(App(x,ts))  \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    73
\    |] ==> R(t)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    74
by (rtac (Rep_Term_inverse RS subst) 1);   (*types force good instantiation*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    75
by (res_inst_tac [("P","Rep_Term(t) : Sexp")] conjunct2 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    76
by (rtac (Rep_Term RS Term_induct) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    77
by (REPEAT (ares_tac [conjI, Sexp_SconsI, Term_subset_Sexp RS 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    78
    List_subset_Sexp,range_Leaf_subset_Sexp] 1
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    79
     ORELSE etac rev_subsetD 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    80
by (eres_inst_tac [("A1","Term(?u)"), ("f1","Rep_Term"), ("g1","Abs_Term")]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    81
    	(Abs_map_inverse RS subst) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    82
by (rtac (range_Leaf_subset_Sexp RS Term_subset_Sexp) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    83
by (etac Abs_Term_inverse 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    84
by (etac rangeE 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    85
by (hyp_subst_tac 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    86
by (resolve_tac prems 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    87
by (etac List_induct 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    88
by (etac CollectE 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    89
by (stac Abs_map_CONS 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    90
by (etac conjunct1 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    91
by (etac rev_subsetD 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    92
by (rtac List_subset_Sexp 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    93
by (fast_tac set_cs 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    94
by (ALLGOALS (asm_simp_tac list_all_ss));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    95
val term_induct = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    96
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    97
(*Induction for the abstract type 'a term*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    98
val prems = goal Term.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    99
    "[| !!x. R(App(x,Nil));  \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   100
\       !!x t ts. R(App(x,ts)) ==> R(App(x, t#ts))  \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   101
\    |] ==> R(t)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   102
by (rtac term_induct 1);  (*types force good instantiation*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   103
by (etac rev_mp 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   104
by (rtac list_induct 1);  (*types force good instantiation*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   105
by (ALLGOALS (asm_simp_tac (list_all_ss addsimps prems)));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   106
val term_induct2 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   107
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   108
(*Perform induction on xs. *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   109
fun term_ind2_tac a i = 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   110
    EVERY [res_inst_tac [("t",a)] term_induct2 i,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   111
	   rename_last_tac a ["1","s"] (i+1)];
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   112
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   113
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   114
(** Introduction rule for Term **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   115
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   116
(* c : A <*> List(Term(A)) ==> c : Term(A) *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   117
val TermI = standard (Term_unfold RS equalityD2 RS subsetD);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   118
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   119
(*The constant APP is not declared; it is simply . *)
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   120
val prems = goal Term.thy "[| M: A;  N : List(Term(A)) |] ==> M$N : Term(A)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   121
by (REPEAT (resolve_tac (prems@[TermI, ListI, uprodI]) 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   122
val APP_I = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   123
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   124
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   125
(*** Term_rec -- by wf recursion on pred_Sexp ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   126
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   127
val Term_rec_unfold =
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   128
    wf_pred_Sexp RS wf_trancl RS (Term_rec_def RS def_wfrec);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   129
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   130
(** conversion rules **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   131
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   132
val [prem] = goal Term.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   133
    "N: List(Term(A)) ==>  \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   134
\    !M. <N,M>: pred_Sexp^+ --> \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   135
\        Abs_map(cut(h, pred_Sexp^+, M), N) = \
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   136
\        Abs_map(h,N)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   137
by (rtac (prem RS List_induct) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   138
by (simp_tac list_all_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   139
by (strip_tac 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   140
by (etac (pred_Sexp_CONS_D RS conjE) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   141
by (asm_simp_tac (list_all_ss addsimps [trancl_pred_SexpD1, cut_apply]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   142
val Abs_map_lemma = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   143
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   144
val [prem1,prem2,A_subset_Sexp] = goal Term.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   145
    "[| M: Sexp;  N: List(Term(A));  A<=Sexp |] ==> \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   146
\    Term_rec(M$N, d) = d(M, N, Abs_map(%Z. Term_rec(Z,d), N))";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   147
by (rtac (Term_rec_unfold RS trans) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   148
by (simp_tac (HOL_ss addsimps
114
b7f57e0ab47c HOL/ex/Term, Simult: updated for new Split
lcp
parents: 48
diff changeset
   149
      [Split,
b7f57e0ab47c HOL/ex/Term, Simult: updated for new Split
lcp
parents: 48
diff changeset
   150
       prem2 RS Abs_map_lemma RS spec RS mp, pred_SexpI2 RS r_into_trancl,
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   151
       prem1, prem2 RS rev_subsetD, List_subset_Sexp,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   152
       Term_subset_Sexp, A_subset_Sexp])1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   153
val Term_rec = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   154
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   155
(*** term_rec -- by Term_rec ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   156
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   157
local
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   158
  val Rep_map_type1 = read_instantiate_sg (sign_of Term.thy)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   159
                        [("f","Rep_Term")] Rep_map_type;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   160
  val Rep_TList = Rep_Term RS Rep_map_type1;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   161
  val Rep_Term_rec = range_Leaf_subset_Sexp RSN (2,Rep_TList RSN(2,Term_rec));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   162
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   163
  (*Now avoids conditional rewriting with the premise N: List(Term(A)),
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   164
    since A will be uninstantiated and will cause rewriting to fail. *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   165
  val term_rec_ss = HOL_ss 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   166
      addsimps [Rep_TList RS (rangeI RS APP_I RS Abs_Term_inverse),  
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   167
	       Rep_Term_in_Sexp, Rep_Term_rec, Rep_Term_inverse,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   168
	       inj_Leaf, Inv_f_f,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   169
	       Abs_Rep_map, map_ident, Sexp_LeafI]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   170
in
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   171
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   172
val term_rec = prove_goalw Term.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   173
	 [term_rec_def, App_def, Rep_TList_def, Abs_TList_def]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   174
    "term_rec(App(f,ts), d) = d(f, ts, map (%t. term_rec(t,d), ts))"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   175
 (fn _ => [simp_tac term_rec_ss 1])
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   176
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   177
end;