src/ZF/ex/termfn.ML
author wenzelm
Fri, 07 Mar 1997 11:48:46 +0100
changeset 2754 59bd96046ad6
parent 29 4ec9b266ccd1
permissions -rw-r--r--
moved settings comment to build;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/term
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   1992  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Terms over a given alphabet -- function applications; illustrates list functor
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
  (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
writeln"File ZF/ex/term-fn.";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
open TermFn;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
(*** term_rec -- by Vset recursion ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
(*Lemma: map works correctly on the underlying list of terms*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
val [major,ordi] = goal ListFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
    "[| l: list(A);  Ord(i) |] ==>  \
29
4ec9b266ccd1 Modification of examples for the new operators, < and le.
lcp
parents: 7
diff changeset
    19
\    rank(l)<i --> map(%z. (lam x:Vset(i).h(x)) ` z, l) = map(h,l)";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
by (rtac (major RS List.induct) 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    21
by (simp_tac list_ss 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
by (rtac impI 1);
29
4ec9b266ccd1 Modification of examples for the new operators, < and le.
lcp
parents: 7
diff changeset
    23
by (forward_tac [rank_Cons1 RS lt_trans] 1);
4ec9b266ccd1 Modification of examples for the new operators, < and le.
lcp
parents: 7
diff changeset
    24
by (dtac (rank_Cons2 RS lt_trans) 1);
4ec9b266ccd1 Modification of examples for the new operators, < and le.
lcp
parents: 7
diff changeset
    25
by (asm_simp_tac (list_ss addsimps [ordi, VsetI]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
val map_lemma = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
(*Typing premise is necessary to invoke map_lemma*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
val [prem] = goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
    "ts: list(A) ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
\    term_rec(Apply(a,ts), d) = d(a, ts, map (%z. term_rec(z,d), ts))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
by (rtac (term_rec_def RS def_Vrec RS trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
by (rewrite_goals_tac Term.con_defs);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    34
val term_rec_ss = ZF_ss addsimps [Ord_rank, rank_pair2, prem RS map_lemma];
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    35
by (simp_tac term_rec_ss 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
val term_rec = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
(*Slightly odd typing condition on r in the second premise!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
val major::prems = goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
    "[| t: term(A);					\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
\       !!x zs r. [| x: A;  zs: list(term(A)); 		\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
\                    r: list(UN t:term(A). C(t)) |]	\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
\                 ==> d(x, zs, r): C(Apply(x,zs))  	\
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
\    |] ==> term_rec(t,d) : C(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
by (rtac (major RS Term.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
by (forward_tac [list_CollectD] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
by (rtac (term_rec RS ssubst) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
by (REPEAT (ares_tac prems 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
by (etac List.induct 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    50
by (ALLGOALS (asm_simp_tac (list_ss addsimps [term_rec])));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by (etac CollectE 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
by (REPEAT (ares_tac [ConsI, UN_I] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
val term_rec_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
val [rew,tslist] = goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
    "[| !!t. j(t)==term_rec(t,d);  ts: list(A) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
\    j(Apply(a,ts)) = d(a, ts, map(%Z.j(Z), ts))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
by (rewtac rew);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
by (rtac (tslist RS term_rec) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
val def_term_rec = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
val prems = goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
    "[| t: term(A);					     \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
\       !!x zs r. [| x: A;  zs: list(term(A));  r: list(C) |]  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
\                 ==> d(x, zs, r): C  		     \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
\    |] ==> term_rec(t,d) : C";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
by (REPEAT (ares_tac (term_rec_type::prems) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
by (etac (subset_refl RS UN_least RS list_mono RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
val term_rec_simple_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
(** term_map **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
val term_map = standard (term_map_def RS def_term_rec);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
val prems = goalw TermFn.thy [term_map_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
    "[| t: term(A);  !!x. x: A ==> f(x): B |] ==> term_map(f,t) : term(B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
by (REPEAT (ares_tac ([term_rec_simple_type, ApplyI] @ prems) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
val term_map_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
val [major] = goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
    "t: term(A) ==> term_map(f,t) : term({f(u). u:A})";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
by (rtac (major RS term_map_type) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
by (etac RepFunI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
val term_map_type2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
(** term_size **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
val term_size = standard (term_size_def RS def_term_rec);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
goalw TermFn.thy [term_size_def] "!!t A. t: term(A) ==> term_size(t) : nat";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
by (REPEAT (ares_tac [term_rec_simple_type, list_add_type, nat_succI] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
val term_size_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
(** reflect **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
val reflect = standard (reflect_def RS def_term_rec);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
goalw TermFn.thy [reflect_def] "!!t A. t: term(A) ==> reflect(t) : term(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
by (REPEAT (ares_tac [term_rec_simple_type, rev_type, ApplyI] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
val reflect_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
(** preorder **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
val preorder = standard (preorder_def RS def_term_rec);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
goalw TermFn.thy [preorder_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
    "!!t A. t: term(A) ==> preorder(t) : list(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by (REPEAT (ares_tac [term_rec_simple_type, ConsI, flat_type] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
val preorder_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
(** Term simplification **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
val term_typechecks =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
    [ApplyI, term_map_type, term_map_type2, term_size_type, reflect_type, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
     preorder_type];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
(*map_type2 and term_map_type2 instantiate variables*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
val term_ss = list_ss 
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   123
      addsimps [term_rec, term_map, term_size, reflect, preorder]
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   124
      setsolver type_auto_tac (list_typechecks@term_typechecks);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
(** theorems about term_map **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
goal TermFn.thy "!!t A. t: term(A) ==> term_map(%u.u, t) = t";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   131
by (asm_simp_tac (term_ss addsimps [map_ident]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
val term_map_ident = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
  "!!t A. t: term(A) ==> term_map(f, term_map(g,t)) = term_map(%u.f(g(u)), t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   137
by (asm_simp_tac (term_ss addsimps [map_compose]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
val term_map_compose = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
    "!!t A. t: term(A) ==> term_map(f, reflect(t)) = reflect(term_map(f,t))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   143
by (asm_simp_tac (term_ss addsimps [rev_map_distrib RS sym, map_compose]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
val term_map_reflect = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
(** theorems about term_size **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
    "!!t A. t: term(A) ==> term_size(term_map(f,t)) = term_size(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   152
by (asm_simp_tac (term_ss addsimps [map_compose]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
val term_size_term_map = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
goal TermFn.thy "!!t A. t: term(A) ==> term_size(reflect(t)) = term_size(t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   157
by (asm_simp_tac (term_ss addsimps [rev_map_distrib RS sym, map_compose,
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   158
				    list_add_rev]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
val term_size_reflect = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
goal TermFn.thy "!!t A. t: term(A) ==> term_size(t) = length(preorder(t))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   163
by (asm_simp_tac (term_ss addsimps [length_flat, map_compose]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
val term_size_length = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
(** theorems about reflect **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
goal TermFn.thy "!!t A. t: term(A) ==> reflect(reflect(t)) = t";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   171
by (asm_simp_tac (term_ss addsimps [rev_map_distrib, map_compose,
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   172
				    map_ident, rev_rev_ident]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
val reflect_reflect_ident = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
(** theorems about preorder **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
goal TermFn.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
    "!!t A. t: term(A) ==> preorder(term_map(f,t)) = map(f, preorder(t))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
by (etac term_induct_eqn 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
   181
by (asm_simp_tac (term_ss addsimps [map_compose, map_flat]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
val preorder_term_map = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
(** preorder(reflect(t)) = rev(postorder(t)) **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
writeln"Reached end of file.";