src/HOL/IMP/Def_Init_Small.thy
changeset 63540 f8652d0534fa
parent 53015 a1119cf551e8
child 67406 23307fd33906
equal deleted inserted replaced
63539:70d4d9e5707b 63540:f8652d0534fa
    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)