0
|
1 |
(* Title: CCL/terms
|
|
2 |
ID: $Id$
|
|
3 |
Author: Martin Coen, Cambridge University Computer Laboratory
|
|
4 |
Copyright 1993 University of Cambridge
|
|
5 |
|
|
6 |
For terms.thy.
|
|
7 |
*)
|
|
8 |
|
|
9 |
open Term;
|
|
10 |
|
|
11 |
val simp_can_defs = [one_def,inl_def,inr_def];
|
|
12 |
val simp_ncan_defs = [if_def,when_def,split_def,fst_def,snd_def,thd_def];
|
|
13 |
val simp_defs = simp_can_defs @ simp_ncan_defs;
|
|
14 |
|
|
15 |
val ind_can_defs = [zero_def,succ_def,nil_def,cons_def];
|
|
16 |
val ind_ncan_defs = [ncase_def,nrec_def,lcase_def,lrec_def];
|
|
17 |
val ind_defs = ind_can_defs @ ind_ncan_defs;
|
|
18 |
|
|
19 |
val data_defs = simp_defs @ ind_defs @ [napply_def];
|
|
20 |
val genrec_defs = [letrec_def,letrec2_def,letrec3_def];
|
|
21 |
|
|
22 |
val term_congs = ccl_mk_congs Term.thy
|
|
23 |
["inl","inr","succ","op .","split","if","when","ncase","nrec","lcase","lrec",
|
|
24 |
"fst","snd","thd","let","letrec","letrec2","letrec3","napply"];
|
|
25 |
|
|
26 |
(*** Beta Rules, including strictness ***)
|
|
27 |
|
|
28 |
goalw Term.thy [let_def] "~ t=bot--> let x be t in f(x) = f(t)";
|
|
29 |
by (res_inst_tac [("t","t")] term_case 1);
|
|
30 |
by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
|
|
31 |
val letB = result() RS mp;
|
|
32 |
|
|
33 |
goalw Term.thy [let_def] "let x be bot in f(x) = bot";
|
|
34 |
br caseBbot 1;
|
|
35 |
val letBabot = result();
|
|
36 |
|
|
37 |
goalw Term.thy [let_def] "let x be t in bot = bot";
|
|
38 |
brs ([caseBbot] RL [term_case]) 1;
|
|
39 |
by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
|
|
40 |
val letBbbot = result();
|
|
41 |
|
|
42 |
goalw Term.thy [apply_def] "(lam x.b(x)) ` a = b(a)";
|
|
43 |
by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
|
|
44 |
val applyB = result();
|
|
45 |
|
|
46 |
goalw Term.thy [apply_def] "bot ` a = bot";
|
|
47 |
br caseBbot 1;
|
|
48 |
val applyBbot = result();
|
|
49 |
|
|
50 |
goalw Term.thy [fix_def] "fix(f) = f(fix(f))";
|
|
51 |
by (resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1);
|
|
52 |
val fixB = result();
|
|
53 |
|
|
54 |
goalw Term.thy [letrec_def]
|
|
55 |
"letrec g x be h(x,g) in g(a) = h(a,%y.letrec g x be h(x,g) in g(y))";
|
|
56 |
by (resolve_tac [fixB RS ssubst] 1 THEN
|
|
57 |
resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1);
|
|
58 |
val letrecB = result();
|
|
59 |
|
|
60 |
val rawBs = caseBs @ [applyB,applyBbot,letrecB];
|
|
61 |
|
|
62 |
fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s
|
|
63 |
(fn _ => [SIMP_TAC (CCL_ss addrews rawBs addcongs term_congs) 1]);
|
|
64 |
fun mk_beta_rl s = raw_mk_beta_rl data_defs s;
|
|
65 |
|
|
66 |
val ifBtrue = mk_beta_rl "if true then t else u = t";
|
|
67 |
val ifBfalse = mk_beta_rl "if false then t else u = u";
|
|
68 |
val ifBbot = mk_beta_rl "if bot then t else u = bot";
|
|
69 |
|
|
70 |
val whenBinl = mk_beta_rl "when(inl(a),t,u) = t(a)";
|
|
71 |
val whenBinr = mk_beta_rl "when(inr(a),t,u) = u(a)";
|
|
72 |
val whenBbot = mk_beta_rl "when(bot,t,u) = bot";
|
|
73 |
|
|
74 |
val splitB = mk_beta_rl "split(<a,b>,h) = h(a,b)";
|
|
75 |
val splitBbot = mk_beta_rl "split(bot,h) = bot";
|
|
76 |
val fstB = mk_beta_rl "fst(<a,b>) = a";
|
|
77 |
val fstBbot = mk_beta_rl "fst(bot) = bot";
|
|
78 |
val sndB = mk_beta_rl "snd(<a,b>) = b";
|
|
79 |
val sndBbot = mk_beta_rl "snd(bot) = bot";
|
|
80 |
val thdB = mk_beta_rl "thd(<a,<b,c>>) = c";
|
|
81 |
val thdBbot = mk_beta_rl "thd(bot) = bot";
|
|
82 |
|
|
83 |
val ncaseBzero = mk_beta_rl "ncase(zero,t,u) = t";
|
|
84 |
val ncaseBsucc = mk_beta_rl "ncase(succ(n),t,u) = u(n)";
|
|
85 |
val ncaseBbot = mk_beta_rl "ncase(bot,t,u) = bot";
|
|
86 |
val nrecBzero = mk_beta_rl "nrec(zero,t,u) = t";
|
|
87 |
val nrecBsucc = mk_beta_rl "nrec(succ(n),t,u) = u(n,nrec(n,t,u))";
|
|
88 |
val nrecBbot = mk_beta_rl "nrec(bot,t,u) = bot";
|
|
89 |
|
|
90 |
val lcaseBnil = mk_beta_rl "lcase([],t,u) = t";
|
|
91 |
val lcaseBcons = mk_beta_rl "lcase(x.xs,t,u) = u(x,xs)";
|
|
92 |
val lcaseBbot = mk_beta_rl "lcase(bot,t,u) = bot";
|
|
93 |
val lrecBnil = mk_beta_rl "lrec([],t,u) = t";
|
|
94 |
val lrecBcons = mk_beta_rl "lrec(x.xs,t,u) = u(x,xs,lrec(xs,t,u))";
|
|
95 |
val lrecBbot = mk_beta_rl "lrec(bot,t,u) = bot";
|
|
96 |
|
|
97 |
val letrec2B = raw_mk_beta_rl (data_defs @ [letrec2_def])
|
|
98 |
"letrec g x y be h(x,y,g) in g(p,q) = \
|
|
99 |
\ h(p,q,%u v.letrec g x y be h(x,y,g) in g(u,v))";
|
|
100 |
val letrec3B = raw_mk_beta_rl (data_defs @ [letrec3_def])
|
|
101 |
"letrec g x y z be h(x,y,z,g) in g(p,q,r) = \
|
|
102 |
\ h(p,q,r,%u v w.letrec g x y z be h(x,y,z,g) in g(u,v,w))";
|
|
103 |
|
|
104 |
val napplyBzero = mk_beta_rl "f^zero`a = a";
|
|
105 |
val napplyBsucc = mk_beta_rl "f^succ(n)`a = f(f^n`a)";
|
|
106 |
|
|
107 |
val termBs = [letB,applyB,applyBbot,splitB,splitBbot,
|
|
108 |
fstB,fstBbot,sndB,sndBbot,thdB,thdBbot,
|
|
109 |
ifBtrue,ifBfalse,ifBbot,whenBinl,whenBinr,whenBbot,
|
|
110 |
ncaseBzero,ncaseBsucc,ncaseBbot,nrecBzero,nrecBsucc,nrecBbot,
|
|
111 |
lcaseBnil,lcaseBcons,lcaseBbot,lrecBnil,lrecBcons,lrecBbot,
|
|
112 |
napplyBzero,napplyBsucc];
|
|
113 |
|
|
114 |
(*** Constructors are injective ***)
|
|
115 |
|
|
116 |
val term_injs = map (mk_inj_rl Term.thy
|
|
117 |
[applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons]
|
|
118 |
(ccl_congs @ term_congs))
|
|
119 |
["(inl(a) = inl(a')) <-> (a=a')",
|
|
120 |
"(inr(a) = inr(a')) <-> (a=a')",
|
|
121 |
"(succ(a) = succ(a')) <-> (a=a')",
|
|
122 |
"(a.b = a'.b') <-> (a=a' & b=b')"];
|
|
123 |
|
|
124 |
(*** Constructors are distinct ***)
|
|
125 |
|
|
126 |
val term_dstncts = mkall_dstnct_thms Term.thy data_defs (ccl_injs @ term_injs)
|
|
127 |
[["bot","inl","inr"],["bot","zero","succ"],["bot","nil","op ."]];
|
|
128 |
|
|
129 |
(*** Rules for pre-order [= ***)
|
|
130 |
|
|
131 |
local
|
|
132 |
fun mk_thm s = prove_goalw Term.thy data_defs s (fn _ =>
|
|
133 |
[SIMP_TAC (ccl_ss addrews (ccl_porews)) 1]);
|
|
134 |
in
|
|
135 |
val term_porews = map mk_thm ["inl(a) [= inl(a') <-> a [= a'",
|
|
136 |
"inr(b) [= inr(b') <-> b [= b'",
|
|
137 |
"succ(n) [= succ(n') <-> n [= n'",
|
|
138 |
"x.xs [= x'.xs' <-> x [= x' & xs [= xs'"];
|
|
139 |
end;
|
|
140 |
|
|
141 |
(*** Rewriting and Proving ***)
|
|
142 |
|
|
143 |
val term_rews = termBs @ term_injs @ term_dstncts @ ccl_porews @ term_porews;
|
|
144 |
val term_ss = ccl_ss addrews term_rews addcongs term_congs;
|
|
145 |
|
|
146 |
val term_cs = ccl_cs addSEs (term_dstncts RL [notE]) addSDs (XH_to_Ds term_injs);
|