author | wenzelm |
Wed, 21 Sep 1994 15:40:41 +0200 | |
changeset 145 | a9f7ff3a464c |
parent 139 | 96c68fd7ed46 |
child 158 | 7c537d03f875 |
permissions | -rw-r--r-- |
132 | 1 |
(* Title: HOL/IMP/Equiv.ML |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
2 |
ID: $Id$ |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
3 |
Author: Heiko Loetzbeyer & Robert Sandner, TUM |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
4 |
Copyright 1994 TUM |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
5 |
*) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
6 |
|
132 | 7 |
goal Equiv.thy "(<a,s> -a-> n) = (A(a,s) = n)"; |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
8 |
by (res_inst_tac [("x","n")] spec 1); (* quantify n *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
9 |
by (aexp.induct_tac "a" 1); (* struct. ind. *) |
137 | 10 |
by (ALLGOALS(simp_tac (HOL_ss addsimps A_simps))); (* rewr. Den. *) |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
11 |
by (TRYALL (fast_tac (set_cs addSIs (evala.intrs@prems) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
12 |
addSEs aexp_elim_cases))); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
13 |
val aexp_iff = result(); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
14 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
15 |
val aexp1 = aexp_iff RS iffD1; |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
16 |
val aexp2 = aexp_iff RS iffD2; |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
17 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
18 |
|
139
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
19 |
goal Equiv.thy "!w. (<b,s> -b-> w) --> (B(b,s) = w)"; |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
20 |
by (bexp.induct_tac "b" 1); |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
21 |
by (rewrite_goals_tac B_simps); (*denotational semantics*) |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
22 |
by (ALLGOALS (fast_tac (HOL_cs addSDs [aexp1] addSEs bexp_elim_cases))); |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
23 |
val bexp_imp1 = result(); |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
24 |
|
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
25 |
goal Equiv.thy "!w. (B(b,s) = w) --> (<b,s> -b-> w)"; |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
26 |
by (bexp.induct_tac "b" 1); |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
27 |
by (rewrite_goals_tac B_simps); (*denotational semantics*) |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
28 |
by (ALLGOALS (best_tac (HOL_cs addSIs (aexp2::evalb.intrs)))); |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
29 |
val bexp_imp2 = result(); |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
30 |
|
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
31 |
val bexp1 = bexp_imp1 RS spec RS mp |> standard; |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
32 |
val bexp2 = bexp_imp2 RS spec RS mp |> standard; |
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
33 |
|
132 | 34 |
goal Equiv.thy "(<b,s> -b-> w) = (B(b,s) = w)"; |
139
96c68fd7ed46
HOL/IMP/Equiv/bexp_iff: split proof into separate directions, to be faster
lcp
parents:
137
diff
changeset
|
35 |
by (fast_tac (HOL_cs addSEs [bexp1,bexp2]) 1); |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
36 |
val bexp_iff = result(); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
37 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
38 |
val BfstI = read_instantiate_sg (sign_of Equiv.thy) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
39 |
[("P","%x.B(?b,x)")] (fst_conv RS ssubst); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
40 |
val BfstD = read_instantiate_sg (sign_of Equiv.thy) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
41 |
[("P","%x.B(?b,x)")] (fst_conv RS subst); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
42 |
|
132 | 43 |
goal Equiv.thy "!!c. <c,s> -c-> t ==> <s,t> : C(c)"; |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
44 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
45 |
(* start with rule induction *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
46 |
be (evalc.mutual_induct RS spec RS spec RS spec RSN (2,rev_mp)) 1; |
137 | 47 |
by (rewrite_tac (Gamma_def::C_simps)); |
48 |
(* simplification with HOL_ss again too agressive *) |
|
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
49 |
(* skip *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
50 |
by (fast_tac comp_cs 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
51 |
(* assign *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
52 |
by (asm_full_simp_tac (prod_ss addsimps [aexp1]) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
53 |
(* comp *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
54 |
by (fast_tac comp_cs 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
55 |
(* if *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
56 |
by(fast_tac (set_cs addSIs [BfstI] addSDs [BfstD,bexp1]) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
57 |
by(fast_tac (set_cs addSIs [BfstI] addSDs [BfstD,bexp1]) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
58 |
(* while *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
59 |
by (rtac (rewrite_rule [Gamma_def] (Gamma_mono RS lfp_Tarski RS ssubst)) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
60 |
by (fast_tac (comp_cs addSIs [bexp1,BfstI] addSDs [BfstD,bexp1]) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
61 |
by (rtac (rewrite_rule [Gamma_def] (Gamma_mono RS lfp_Tarski RS ssubst)) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
62 |
by (fast_tac (comp_cs addSIs [bexp1,BfstI] addSDs [BfstD,bexp1]) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
63 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
64 |
val com1 = result(); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
65 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
66 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
67 |
val com_cs = comp_cs addSIs [aexp2,bexp2] addIs evalc.intrs; |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
68 |
|
132 | 69 |
goal Equiv.thy "!io:C(c). <c,fst(io)> -c-> snd(io)"; |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
70 |
by (com.induct_tac "c" 1); |
137 | 71 |
by (rewrite_tac C_simps); |
131
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
72 |
by (safe_tac com_cs); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
73 |
by (ALLGOALS (asm_full_simp_tac prod_ss)); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
74 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
75 |
(* skip *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
76 |
by (fast_tac com_cs 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
77 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
78 |
(* assign *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
79 |
by (fast_tac com_cs 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
80 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
81 |
(* comp *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
82 |
by (REPEAT (EVERY [(dtac bspec 1),(atac 1)])); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
83 |
by (asm_full_simp_tac prod_ss 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
84 |
by (fast_tac com_cs 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
85 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
86 |
(* while *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
87 |
by (etac (Gamma_mono RSN (2,induct)) 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
88 |
by (rewrite_goals_tac [Gamma_def]); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
89 |
by (safe_tac com_cs); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
90 |
by (EVERY1 [dtac bspec, atac]); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
91 |
by (ALLGOALS (asm_full_simp_tac prod_ss)); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
92 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
93 |
(* while, if *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
94 |
by (ALLGOALS (fast_tac com_cs)); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
95 |
val com2 = result(); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
96 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
97 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
98 |
(**** Proof of Equivalence ****) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
99 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
100 |
val com_iff_cs = set_cs addEs [com2 RS bspec] |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
101 |
addDs [com1]; |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
102 |
|
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
103 |
goal Equiv.thy "C(c) = {io . <c,fst(io)> -c-> snd(io)}"; |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
104 |
by (rtac equalityI 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
105 |
(* => *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
106 |
by (fast_tac com_iff_cs 1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
107 |
(* <= *) |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
108 |
by (REPEAT (step_tac com_iff_cs 1)); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
109 |
by (asm_full_simp_tac (prod_ss addsimps [surjective_pairing RS sym])1); |
41bf53133ba6
Equivalence of op. and den. sem. for simple while language.
nipkow
parents:
diff
changeset
|
110 |
val com_equivalence = result(); |