65 using eval restricted to its functional part. Note that the execution |
65 using eval restricted to its functional part. Note that the execution |
66 (c,s) -[eval]-> s2 can use unrestricted eval! The reason is that |
66 (c,s) -[eval]-> s2 can use unrestricted eval! The reason is that |
67 the execution (c,s) -[eval Int {...}]-> s1 assures us that execution is |
67 the execution (c,s) -[eval Int {...}]-> s1 assures us that execution is |
68 functional on the argument (c,s). |
68 functional on the argument (c,s). |
69 *) |
69 *) |
70 Goal |
70 Goal "(c,s) -[eval Int {((e,s),(n,s')). Unique (e,s) (n,s') eval}]-> s1 \ |
71 "!!x. (c,s) -[eval Int {((e,s),(n,s')). Unique (e,s) (n,s') eval}]-> s1 \ |
71 \ ==> (ALL s2. (c,s) -[eval]-> s2 --> s2=s1)"; |
72 \ ==> (ALL s2. (c,s) -[eval]-> s2 --> s2=s1)"; |
|
73 by (etac exec.induct 1); |
72 by (etac exec.induct 1); |
74 by (ALLGOALS Full_simp_tac); |
73 by (ALLGOALS Full_simp_tac); |
75 by (Blast_tac 3); |
74 by (Blast_tac 3); |
76 by (Blast_tac 1); |
75 by (Blast_tac 1); |
77 by (rewtac Unique_def); |
76 by (rewtac Unique_def); |