Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Complx/   (Sammlung formaler Beweise Version 2026-5©)  Datei vom 29.4.2026 mit Größe 19 kB image not shown  

Quelle  SeqCatch_decomp.thy

  Sprache: Isabelle
 

(*
 * 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=p1and 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=p1in 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=c1and 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=p1and 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=c1in 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=c1in 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=p1in steps_Stuck[where Γ=Γ])
  apply fastforce
 done

end

Messung V0.5 in Prozent
C=84 H=99 G=91

¤ Dauer der Verarbeitung: 0.8 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

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.