equal
deleted
inserted
replaced
56 |
56 |
57 theorem D_preservation: |
57 theorem D_preservation: |
58 "(c,s) \<rightarrow> (c',s') \<Longrightarrow> D (dom s) c A \<Longrightarrow> EX A'. D (dom s') c' A' & A <= A'" |
58 "(c,s) \<rightarrow> (c',s') \<Longrightarrow> D (dom s) c A \<Longrightarrow> EX A'. D (dom s') c' A' & A <= A'" |
59 proof (induction arbitrary: A rule: small_step_induct) |
59 proof (induction arbitrary: A rule: small_step_induct) |
60 case (While b c s) |
60 case (While b c s) |
61 then obtain A' where "vars b \<subseteq> dom s" "A = dom s" "D (dom s) c A'" by blast |
61 then obtain A' where A': "vars b \<subseteq> dom s" "A = dom s" "D (dom s) c A'" by blast |
62 moreover |
|
63 then obtain A'' where "D A' c A''" by (metis D_incr D_mono) |
62 then obtain A'' where "D A' c A''" by (metis D_incr D_mono) |
64 ultimately have "D (dom s) (IF b THEN c;; WHILE b DO c ELSE SKIP) (dom s)" |
63 with A' have "D (dom s) (IF b THEN c;; WHILE b DO c ELSE SKIP) (dom s)" |
65 by (metis D.If[OF `vars b \<subseteq> dom s` D.Seq[OF `D (dom s) c A'` D.While[OF _ `D A' c A''`]] D.Skip] D_incr Int_absorb1 subset_trans) |
64 by (metis D.If[OF `vars b \<subseteq> dom s` D.Seq[OF `D (dom s) c A'` D.While[OF _ `D A' c A''`]] D.Skip] D_incr Int_absorb1 subset_trans) |
66 thus ?case by (metis D_incr `A = dom s`) |
65 thus ?case by (metis D_incr `A = dom s`) |
67 next |
66 next |
68 case Seq2 thus ?case by auto (metis D_mono D.intros(3)) |
67 case Seq2 thus ?case by auto (metis D_mono D.intros(3)) |
69 qed (auto intro: D.intros) |
68 qed (auto intro: D.intros) |