(*
* Copyright 2016 , Data61 , CSIRO
*
* This software may be distributed and modified according to the terms of
* the BSD 2 - Clause license . Note that NO WARRANTY is provided .
* See " LICENSE_BSD2 . txt " for details .
*
* @ TAG ( DATA61_BSD )
*)
text ‹ Helper lemmas for sequential reasoning about Seq and Catch›
theory SeqCatch_decomp
imports SmallStep
begin
lemma redex_size[rule_format] :
"∀ r. redex c = r ⟶ size r ≤ size c"
by (induct_tac c, simp_all)
lemma Normal_pre[rule_format, OF _ refl] :
"Γ ⊨ (p, s) → (p', s') ==>
∀ u. s' = Normal u ⟶ (∃ v. s = Normal v)"
by (erule step_induct, simp_all)
lemma Normal_pre_star[rule_format, OF _ refl] :
"Γ ⊨ cfg1 → * cfg2 ==> ∀ p' t. cfg2 = (p', Normal t) ⟶
(∃ p s. cfg1 = (p, Normal s))"
apply (erule converse_rtranclp_induct)
apply simp
apply clarsimp
apply (drule Normal_pre)
by force
lemma Seq_decomp_Skip[rule_format, OF _ refl] :
"Γ ⊨ (p, s) → (p', s') ==>
∀ p2 . p = Seq Skip p2 ⟶ s' = s ∧ p' = p2 "
apply (erule step_induct, simp_all)
apply clarsimp
apply (erule step.cases, simp_all)
apply clarsimp+
done
lemma Seq_decomp_Throw[rule_format, OF _ refl, OF _ refl] :
"Γ ⊨ (p, s) → (p', s') ==>
∀ p2 z. s = Normal z ⟶ p = Seq Throw p2 ⟶ s' = s ∧ p' = Throw"
apply (erule step_induct, simp_all)
apply clarsimp
apply (erule step.cases, simp_all)
done
lemma Throw_star[rule_format, OF _ refl] :
"Γ ⊨ cfg1 → * cfg2 ==> ∀ s. cfg1 = (Throw, Normal s) ⟶
cfg2 = cfg1 "
apply (erule converse_rtranclp_induct)
apply simp
apply clarsimp
apply (erule step.cases, simp_all)
done
lemma Seq_decomp[rule_format, OF _ refl] :
"Γ ⊨ (p, s) → (p', s') ==>
∀ p1 p2 . p = Seq p1 p2 ⟶ p1 ≠ Skip ⟶ p1 ≠ Throw ⟶
(∃ p1 '. Γ ⊨ (p1 , s) → (p1 ', s') ∧ p' = Seq p1 ' p2 )"
apply (erule step_induct, simp_all)
apply clarsimp
apply (drule redex_size)
apply simp
apply clarsimp
apply (drule redex_size)
apply simp
done
lemma Seq_decomp_relpow:
"Γ ⊨ (Seq p1 p2 , Normal s) → nn (p', Normal s') ==>
final (p', Normal s') ==>
(∃ n1<n. Γ ⊨ (p1 , Normal s) → nn1 (Throw, Normal s')) ∧ p'=Throw ∨
(∃ t n1 n2. Γ ⊨ (p1 , Normal s) → nn1 (Skip, Normal t) ∧ n1 < n ∧ n2 < n ∧ Γ ⊨ (p2 , Normal t) → nn2 (p', Normal s'))"
apply (induct n arbitrary: p1 p2 s p' s')
apply (clarsimp simp: final_def)
apply (simp only: relpowp.simps)
apply (subst (asm) relpowp_commute[symmetric])
apply clarsimp
apply (rename_tac n p1 p2 s p' s' a b)
apply (case_tac "p1 = Skip" )
apply clarsimp
apply (drule Seq_decomp_Skip)
apply clarsimp
apply (drule_tac x=s in spec)
apply (drule_tac x=0 in spec)
apply simp
apply (rename_tac n p1 p2 s p' s' a b)
apply (case_tac "p1 = Throw" )
apply clarsimp
apply (drule Seq_decomp_Throw)
apply clarsimp
apply (frule relpowp_imp_rtranclp)
apply (drule Throw_star)
apply clarsimp
apply (rule_tac x=n in exI, simp)
apply (drule Seq_decomp)
apply assumption+
apply (rename_tac n p1 p2 s p' s' a b)
apply clarsimp
apply (frule relpowp_imp_rtranclp)
apply (drule Normal_pre_star)
apply clarsimp
apply (drule meta_spec, drule meta_spec, drule meta_spec, drule meta_spec, drule meta_spec, drule meta_mp, assumption)
apply (drule meta_mp, assumption)
apply (erule disjE, clarsimp)
apply (rename_tac n1)
apply (rule_tac x="Suc n1" in exI, simp)
apply (subst relpowp_commute[symmetric])
apply (rule_tac relcomppI, assumption+)
apply clarsimp
apply (rename_tac t n1 n2)
apply (drule_tac x=t in spec)
apply (drule_tac x="Suc n1" in spec)
apply simp
apply (drule mp)
apply (subst relpowp_commute[symmetric])
apply (rule_tac relcomppI, assumption+)
apply simp
done
lemma Seq_decomp_star:
"Γ ⊨ (Seq p1 p2 , Normal s) → * (p', Normal s') ==> final (p', Normal s') ==>
Γ ⊨ (p1 , Normal s) → * (Throw, Normal s') ∧ p'=Throw ∨
(∃ t. Γ ⊨ (p1 , Normal s) → * (Skip, Normal t) ∧ Γ ⊨ (p2 , Normal t) → * (p', Normal s'))"
apply (drule rtranclp_imp_relpowp)
apply clarsimp
apply (drule (1 ) Seq_decomp_relpow)
apply (erule disjE)
apply clarsimp
apply (drule (1 ) relpowp_imp_rtranclp)
apply clarsimp
apply (drule relpowp_imp_rtranclp)+
apply clarsimp
done
lemma Seq_decomp_relpowp_Fault:
"Γ ⊨ (Seq p1 p2 , Normal s) → nn (Skip, Fault f) ==>
(∃ n1. Γ ⊨ (p1 , Normal s) → nn1 (Skip, Fault f)) ∨
(∃ t n1 n2. Γ ⊨ (p1 , Normal s) → nn1 (Skip, Normal t) ∧ n1 < n ∧ n2 < n ∧ Γ ⊨ (p2 , Normal t) → nn2 (Skip, Fault f))"
apply (induct n arbitrary: s p1 )
apply (clarsimp simp: final_def)
apply (simp only: relpowp.simps)
apply (subst (asm) relpowp_commute[symmetric])
apply clarsimp
apply (rename_tac n s p1 a b)
apply (case_tac "p1 = Skip" )
apply simp
apply (drule Seq_decomp_Skip)
apply clarify
apply (drule_tac x=s in spec)
apply (drule spec[where x=0 ])
apply simp
apply (case_tac "p1 = Throw" )
apply simp
apply (drule Seq_decomp_Throw)
apply fastforce
apply (frule Seq_decomp )
apply simp+
apply clarsimp
apply (rename_tac s p1 t p1')
apply (case_tac "∃ v. Normal v = t" )
apply clarsimp
apply (rename_tac v)
apply (drule_tac x=v in meta_spec)
apply (drule_tac x=p1' in meta_spec)
apply clarsimp
apply (erule disjE)
apply clarsimp
apply (rename_tac n1)
apply (rule_tac x="n1+1" in exI)
apply (drule (1 ) relpowp_Suc_I2, fastforce)
apply clarsimp
apply (rename_tac t n1 n2)
apply (drule_tac x=t in spec)
apply (drule_tac x="n1+1" in spec)
apply simp
apply (subst (asm) relpowp_commute[symmetric])
apply (drule mp)
apply (erule relcomppI, assumption)
apply clarsimp
apply (case_tac "t = Stuck" )
apply clarsimp
apply (drule relpowp_imp_rtranclp)
apply (fastforce dest: steps_Stuck_prop)
apply (case_tac t, simp_all)
apply (rename_tac f')
apply (frule steps_Fault_prop[where s'="Fault f" , OF relpowp_imp_rtranclp, THEN sym], rule refl)
apply clarify
apply (cut_tac c=p1' in steps_Fault[where Γ=Γ and f=f])
apply (drule rtranclp_imp_relpowp)
apply clarsimp
apply (rename_tac n')
apply (rule_tac x="n'+1" in exI)
apply simp
apply (subst relpowp_commute[symmetric])
apply (erule relcomppI, assumption)
done
lemma Seq_decomp_star_Fault[rule_format, OF _ refl, OF _ refl, OF _ refl] :
"Γ ⊨ cfg1 → * cfg2 ==> ∀ p s p' f. cfg1 = (p, Normal s) ⟶ cfg2 = (Skip, Fault f) ⟶
(∀ p1 p2 . p = Seq p1 p2 ⟶
(Γ ⊨ (p1 , Normal s) → * (Skip, Fault f))
∨ (∃ s'. (Γ ⊨ (p1 , Normal s) → * (Skip, Normal s')) ∧ Γ ⊨ (p2 , Normal s') → * (Skip, Fault f)))"
apply (erule converse_rtranclp_induct)
apply clarsimp
apply clarsimp
apply (rename_tac c s' s f p1 p2 )
apply (case_tac "p1 = Skip" )
apply simp
apply (drule Seq_decomp_Skip)
apply simp
apply (case_tac "p1 = Throw" )
apply simp
apply (drule Seq_decomp_Throw)
apply simp
apply (drule Seq_decomp)
apply simp+
apply clarsimp
apply (case_tac s')
apply simp
apply (erule disjE)
apply (erule (1 ) converse_rtranclp_into_rtranclp)
apply clarsimp
apply (rename_tac s')
apply (erule_tac x="s'" in allE)
apply (drule (1 ) converse_rtranclp_into_rtranclp, fastforce)
apply simp
apply (frule steps_Fault_prop[THEN sym], rule refl)
apply simp
apply (cut_tac c=p1 ' and f=f in steps_Fault[where Γ=Γ])
apply (drule (2 ) converse_rtranclp_into_rtranclp)
apply clarsimp
apply (frule steps_Stuck_prop[THEN sym], rule refl)
apply simp
done
lemma Seq_decomp_relpowp_Stuck:
"Γ ⊨ (Seq p1 p2 , Normal s) → nn (Skip, Stuck) ==>
(∃ n1. Γ ⊨ (p1 , Normal s) → nn1 (Skip, Stuck)) ∨
(∃ t n1 n2. Γ ⊨ (p1 , Normal s) → nn1 (Skip, Normal t) ∧ n1 < n ∧ n2 < n ∧ Γ ⊨ (p2 , Normal t) → nn2 (Skip, Stuck))"
apply (induct n arbitrary: s p1 )
apply (clarsimp simp: final_def)
apply (simp only: relpowp.simps)
apply (subst (asm) relpowp_commute[symmetric])
apply clarsimp
apply (rename_tac n s p1 a b)
apply (case_tac "p1 = Skip" )
apply simp
apply (drule Seq_decomp_Skip)
apply clarify
apply (drule_tac x=s in spec)
apply (drule spec[where x=0 ])
apply simp
apply (case_tac "p1 = Throw" )
apply simp
apply (drule Seq_decomp_Throw)
apply fastforce
apply (frule Seq_decomp )
apply simp+
apply clarsimp
apply (rename_tac s p1 t p1')
apply (case_tac "∃ v. Normal v = t" )
apply clarsimp
apply (rename_tac v)
apply (drule_tac x=v in meta_spec)
apply (drule_tac x=p1' in meta_spec)
apply clarsimp
apply (erule disjE)
apply clarsimp
apply (rename_tac n1)
apply (rule_tac x="n1+1" in exI)
apply (drule (1 ) relpowp_Suc_I2, fastforce)
apply clarsimp
apply (rename_tac t n1 n2)
apply (drule_tac x=t in spec)
apply (drule_tac x="n1+1" in spec)
apply simp
apply (subst (asm) relpowp_commute[symmetric])
apply (drule mp)
apply (erule relcomppI, assumption)
apply clarsimp
apply (case_tac "∃ v. t = Fault v" )
apply clarsimp
apply (drule relpowp_imp_rtranclp)
apply (fastforce dest: steps_Fault_prop)
apply (case_tac t, simp_all)
apply (rename_tac p1')
apply clarify
apply (cut_tac c=p1' in steps_Stuck[where Γ=Γ])
apply (drule rtranclp_imp_relpowp)
apply clarsimp
apply (rename_tac n')
apply (rule_tac x="n'+1" in exI)
apply simp
apply (subst relpowp_commute[symmetric])
apply (erule relcomppI, assumption)
done
lemma Seq_decomp_star_Stuck[rule_format, OF _ refl, OF _ refl] :
"Γ ⊨ cfg1 → * (Skip, Stuck) ==> ∀ p s p'. cfg1 = (p, Normal s) ⟶
(∀ p1 p2 . p = Seq p1 p2 ⟶
(Γ ⊨ (p1 , Normal s) → * (Skip, Stuck))
∨ (∃ s'. (Γ ⊨ (p1 , Normal s) → * (Skip, Normal s')) ∧ Γ ⊨ (p2 , Normal s') → * (Skip, Stuck)))"
apply (erule converse_rtranclp_induct)
apply clarsimp
apply clarsimp
apply (rename_tac c s' s p1 p2 )
apply (case_tac "p1 = Skip" )
apply simp
apply (drule Seq_decomp_Skip)
apply simp
apply (case_tac "p1 = Throw" )
apply simp
apply (drule Seq_decomp_Throw)
apply simp
apply (drule Seq_decomp)
apply simp+
apply clarsimp
apply (rename_tac s' s p1 p2 p1 ')
apply (case_tac s')
apply simp
apply (erule disjE)
apply (erule (1 ) converse_rtranclp_into_rtranclp)
apply clarsimp
apply (rename_tac s')
apply (erule_tac x="s'" in allE)
apply (drule (1 ) converse_rtranclp_into_rtranclp, fastforce)
apply simp
apply (drule steps_Fault_prop, rule refl, fastforce)
apply simp
apply (cut_tac c=p1 ' in steps_Stuck[where Γ=Γ])
apply (frule steps_Stuck_prop[THEN sym], rule refl)
apply simp
done
lemma Catch_decomp_star[rule_format, OF _ refl, OF _ refl, OF _ _ refl]:
" Γ ⊨ cfg1 → * cfg2 ==>
∀ p s p' s'.
cfg1 = (p, Normal s) ⟶
cfg2 = (p', Normal s') ⟶
final (p', Normal s') ⟶
(∀ p1 p2 .
p = Catch p1 p2 ⟶
(∃ t. Γ ⊨ (p1 , Normal s) → * (Throw, Normal t) ∧ Γ ⊨ (p2 , Normal t) → * (p', Normal s')) ∨
(Γ ⊨ (p1 , Normal s) → * (Skip, Normal s') ∧ p' = Skip))"
apply (erule converse_rtranclp_induct)
apply (clarsimp simp: final_def)
apply clarsimp
apply (rename_tac a b s p' s' p1 p2 )
apply (case_tac b)
apply clarsimp
apply (rename_tac x)
apply (erule step_Normal_elim_cases)
apply clarsimp
apply (erule disjE)
apply clarsimp
apply (rename_tac t)
apply (rule_tac x=t in exI)
apply fastforce
apply (erule impE)
apply fastforce
apply fastforce
apply clarsimp
apply (clarsimp simp: final_def)
apply (erule disjE)
apply fastforce
apply clarsimp
apply (fastforce dest: no_steps_final simp: final_def)
apply (clarsimp simp: final_def)
apply (erule disjE)
apply clarsimp
apply (rename_tac s s' p2 )
apply (rule_tac x=s in exI)
apply fastforce
apply fastforce
apply (fastforce dest: steps_Fault_prop)
apply (fastforce dest: steps_Stuck_prop)
done
lemma Catch_decomp_Skip[rule_format, OF _ refl] :
"Γ ⊨ (p, s) → (p', s') ==>
∀ p2 . p = Catch Skip p2 ⟶ s' = s ∧ p' = Skip"
apply (erule step_induct, simp_all)
apply clarsimp
apply (erule step.cases, simp_all)
done
lemma Catch_decomp[rule_format, OF _ refl] :
"Γ ⊨ (p, s) → (p', s') ==>
∀ p1 p2 . p = Catch p1 p2 ⟶ p1 ≠ Skip ⟶ p1 ≠ Throw ⟶
(∃ p1 '. Γ ⊨ (p1 , s) → (p1 ', s') ∧ p' = Catch p1 ' p2 )"
apply (erule step_induct, simp_all)
apply clarsimp
apply (drule redex_size)
apply simp
apply clarsimp
apply (drule redex_size)
apply simp
done
lemma Catch_decomp_star_Fault[rule_format, OF _ refl, OF _ refl, OF _ refl] :
"Γ ⊨ cfg1 → * cfg2 ==> ∀ p s f. cfg1 = (p, Normal s) ⟶ cfg2 = (Skip, Fault f) ⟶
(∀ p1 p2 . p = Catch p1 p2 ⟶
(Γ ⊨ (p1 , Normal s) → * (Skip, Fault f))
∨ (∃ s'. (Γ ⊨ (p1 , Normal s) → * (Throw, Normal s')) ∧ Γ ⊨ (p2 , Normal s') → * (Skip, Fault f)))"
apply (erule converse_rtranclp_induct)
apply clarsimp
apply clarsimp
apply (rename_tac c s' s f p1 p2 )
apply (case_tac "p1 = Skip" )
apply (fastforce dest: Catch_decomp_Skip)
apply (case_tac "p1 = Throw" )
apply simp
apply (case_tac s')
apply clarsimp
apply (erule step_Normal_elim_cases)
apply clarsimp
apply (erule disjE)
apply fastforce
apply (fastforce elim: no_step_final simp:final_def)
apply fastforce
apply fastforce
apply clarsimp
apply (drule_tac x=s in spec)
apply clarsimp
apply (erule step_elim_cases, simp_all)
apply clarsimp
apply (cut_tac c=c1 ' and f=f in steps_Fault[where Γ=Γ])
apply (drule steps_Fault_prop, rule refl)
apply fastforce
apply (fastforce dest: steps_Stuck_prop)
apply (drule (2 ) Catch_decomp)
apply clarsimp
apply (rename_tac p1 ')
apply (case_tac s')
apply simp
apply (erule disjE)
apply (erule (1 ) converse_rtranclp_into_rtranclp)
apply clarsimp
apply (rename_tac s')
apply (erule_tac x="s'" in allE)
apply (drule (1 ) converse_rtranclp_into_rtranclp, fastforce)
apply simp
apply (frule steps_Fault_prop[THEN sym], rule refl)
apply simp
apply (cut_tac c=p1 ' and f=f in steps_Fault[where Γ=Γ])
apply (drule (2 ) converse_rtranclp_into_rtranclp)
apply (fastforce dest: steps_Stuck_prop)
done
lemma Catch_decomp_star_Stuck[rule_format, OF _ refl, OF _ refl, OF _ refl] :
"Γ ⊨ cfg1 → * cfg2 ==> ∀ p s. cfg1 = (p, Normal s) ⟶ cfg2 = (Skip, Stuck) ⟶
(∀ p1 p2 . p = Catch p1 p2 ⟶
(Γ ⊨ (p1 , Normal s) → * (Skip, Stuck))
∨ (∃ s'. (Γ ⊨ (p1 , Normal s) → * (Throw, Normal s')) ∧ Γ ⊨ (p2 , Normal s') → * (Skip, Stuck)))"
apply (erule converse_rtranclp_induct)
apply clarsimp
apply clarsimp
apply (rename_tac c s' s p1 p2 )
apply (case_tac "p1 = Skip" )
apply (fastforce dest: Catch_decomp_Skip)
apply (case_tac "p1 = Throw" )
apply simp
apply (case_tac s')
apply clarsimp
apply (erule step_Normal_elim_cases)
apply clarsimp
apply (erule disjE)
apply fastforce
apply (fastforce elim: no_step_final simp:final_def)
apply fastforce
apply fastforce
apply clarsimp
apply (drule_tac x=s in spec)
apply clarsimp
apply (erule step_elim_cases, simp_all)
apply clarsimp
apply (rename_tac c1 ')
apply (cut_tac c=c1 ' in steps_Fault[where Γ=Γ])
apply (drule steps_Fault_prop, rule refl)
apply fastforce
apply (drule_tac x=s in spec)
apply clarsimp
apply (erule step_elim_cases, simp_all)
apply clarsimp
apply (cut_tac c=c1 ' in steps_Stuck[where Γ=Γ])
apply (fastforce)
apply (drule (2 ) Catch_decomp)
apply clarsimp
apply (rename_tac p1 ')
apply (case_tac s')
apply simp
apply (erule disjE)
apply (erule (1 ) converse_rtranclp_into_rtranclp)
apply clarsimp
apply (rename_tac s')
apply (erule_tac x="s'" in allE)
apply (drule (1 ) converse_rtranclp_into_rtranclp, fastforce)
apply simp
apply (frule steps_Fault_prop[THEN sym], rule refl)
apply fastforce
apply (cut_tac c=p1 ' in steps_Stuck[where Γ=Γ])
apply fastforce
done
end
Messung V0.5 in Prozent C=88 H=97 G=92
¤ Dauer der Verarbeitung: 0.11 Sekunden
¤
*© Formatika GbR, Deutschland
Wurzel
Suchen
NIST Cobol Testsuite
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.