188
|
1 |
(* Title: HOL/IMP/Properties.ML
|
|
2 |
ID: $Id$
|
|
3 |
Author: Tobias Nipkow, TUM
|
|
4 |
Copyright 1994 TUM
|
|
5 |
|
|
6 |
IMP is deterministic.
|
|
7 |
*)
|
|
8 |
|
|
9 |
(* evaluation of aexp is deterministic *)
|
|
10 |
goal Com.thy "!m n. <a,s> -a-> m & <a,s> -a-> n --> m=n";
|
|
11 |
by(res_inst_tac[("aexp","a")]Com.aexp.induct 1);
|
|
12 |
by(REPEAT(fast_tac (HOL_cs addSIs evala.intrs addSEs evala_elim_cases) 1));
|
|
13 |
val aexp_detD =
|
|
14 |
store_thm("aexp_detD", conjI RS (result() RS spec RS spec RS mp));
|
|
15 |
|
|
16 |
(* evaluation of bexp is deterministic *)
|
|
17 |
goal Com.thy "!v w. <b,s> -b-> v & <b,s> -b-> w --> v=w";
|
|
18 |
by(res_inst_tac[("bexp","b")]Com.bexp.induct 1);
|
|
19 |
by(REPEAT(fast_tac (HOL_cs addSIs evalb.intrs addSEs evalb_elim_cases
|
|
20 |
addDs [aexp_detD]) 1));
|
|
21 |
val bexp_detD =
|
|
22 |
store_thm("bexp_detD", conjI RS (result() RS spec RS spec RS mp));
|
|
23 |
|
|
24 |
|
|
25 |
val evalc_elim_cases = map (evalc.mk_cases com.simps)
|
|
26 |
["<skip,s> -c-> t", "<x:=a,s> -c-> t", "<c1;c2, s> -c-> t",
|
|
27 |
"<ifc b then c1 else c2, s> -c-> t", "<while b do c,s> -c-> t"];
|
|
28 |
|
|
29 |
(* evaluation of com is deterministic *)
|
|
30 |
goal Com.thy "!!c. <c,s> -c-> t ==> !u. <c,s> -c-> u --> u=t";
|
|
31 |
(* start with rule induction *)
|
|
32 |
be (evalc.mutual_induct RS spec RS spec RS spec RSN (2,rev_mp)) 1;
|
|
33 |
by(fast_tac (set_cs addSEs evalc_elim_cases) 1);
|
|
34 |
by(fast_tac (set_cs addSEs evalc_elim_cases addDs [aexp_detD]) 1);
|
|
35 |
by(fast_tac (set_cs addSEs evalc_elim_cases) 1);
|
|
36 |
by(fast_tac (set_cs addSEs evalc_elim_cases addDs [bexp_detD]) 1);
|
|
37 |
by(fast_tac (set_cs addSEs evalc_elim_cases addDs [bexp_detD]) 1);
|
|
38 |
by(EVERY1[strip_tac, eresolve_tac evalc_elim_cases,
|
|
39 |
atac, dtac bexp_detD, atac, etac False_neq_True]);
|
|
40 |
by(EVERY1[strip_tac, eresolve_tac evalc_elim_cases,
|
|
41 |
dtac bexp_detD, atac, etac (sym RS False_neq_True),
|
|
42 |
fast_tac HOL_cs]);
|
|
43 |
result();
|