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

Quelle  Hoare.thy

  Sprache: Isabelle
 

(*
    Author:      Norbert Schirmer
    Maintainer:  Norbert Schirmer, norbert.schirmer at web de

Copyright (C) 2006-2008 Norbert Schirmer
*)


section Auxiliary Definitions/Lemmas to Facilitate Hoare Logic
theory Hoare imports HoarePartial HoareTotal begin


syntax

"_hoarep_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,
   'f set,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
    ((3_,_/ (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoarep_emptyCtx"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
    ((3_//_ (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoarep_emptyCtx_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
    ((3_/ (_/ (_)/ _,/_)) [61,1000,20,1000,1000]60)

"_hoarep_noAbr"::
"[('s,'p,'f) body,('s,'p) quadruple set,'f set,
    's assn,('s,'p,'f) com, 's assn] => bool"
    ((3_,_//_ (_/ (_)/ _)) [61,60,60,1000,20,1000]60)

"_hoarep_noAbr_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,'s assn,('s,'p,'f) com, 's assn] => bool"
    ((3_,_/ (_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoarep_emptyCtx_noAbr"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn] => bool"
    ((3_//_ (_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoarep_emptyCtx_noAbr_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn] => bool"
    ((3_/ (_/ (_)/ _)) [61,1000,20,1000]60)



"_hoaret_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,
    's assn,('s,'p,'f) com, 's assn,'s assn] => bool"
    ((3_,_/t (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoaret_emptyCtx"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
    ((3_/t/_ (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoaret_emptyCtx_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
    ((3_/t (_/ (_)/ _,/_)) [61,1000,20,1000,1000]60)

"_hoaret_noAbr"::
"[('s,'p,'f) body,'f set, ('s,'p) quadruple set,
    's assn,('s,'p,'f) com, 's assn] => bool"
    ((3_,_/t/_ (_/ (_)/ _)) [61,60,60,1000,20,1000]60)

"_hoaret_noAbr_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,'s assn,('s,'p,'f) com, 's assn] => bool"
    ((3_,_/t (_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoaret_emptyCtx_noAbr"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn] => bool"
    ((3_/t/_ (_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoaret_emptyCtx_noAbr_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn] => bool"
    ((3_/t (_/ (_)/ _)) [61,1000,20,1000]60)


syntax (ASCII)

"_hoarep_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,
     's assn,('s,'p,'f) com, 's assn,'s assn] ==> bool"
   ((3_,_/|- (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoarep_emptyCtx"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
   ((3_/|-'/_ (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoarep_emptyCtx_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
   ((3_/|-(_/ (_)/ _,/_)) [61,1000,20,1000,1000]60)

"_hoarep_noAbr"::
"[('s,'p,'f) body,('s,'p) quadruple set,'f set,
   's assn,('s,'p,'f) com, 's assn] => bool"
   ((3_,_/|-'/_ (_/ (_)/ _)) [61,60,60,1000,20,1000]60)

"_hoarep_noAbr_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,'s assn,('s,'p,'f) com, 's assn] => bool"
   ((3_,_/|-(_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoarep_emptyCtx_noAbr"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn] => bool"
   ((3_/|-'/_ (_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoarep_emptyCtx_noAbr_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn] => bool"
   ((3_/|-(_/ (_)/ _)) [61,1000,20,1000]60)

"_hoaret_emptyFault"::
"[('s,'p,'f) body,('s,'p) quadruple set,
     's assn,('s,'p,'f) com, 's assn,'s assn] => bool"
   ((3_,_/|-t (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoaret_emptyCtx"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
   ((3_/|-t'/_ (_/ (_)/ _,/_)) [61,60,1000,20,1000,1000]60)

"_hoaret_emptyCtx_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn,'s assn] => bool"
   ((3_/|-t(_/ (_)/ _,/_)) [61,1000,20,1000,1000]60)

"_hoaret_noAbr"::
"[('s,'p,'f) body,('s,'p) quadruple set,'f set,
   's assn,('s,'p,'f) com, 's assn] => bool"
   ((3_,_/|-t'/_ (_/ (_)/ _)) [61,60,60,1000,20,1000]60)

"_hoaret_noAbr_emptyFaults"::
"[('s,'p,'f) body,('s,'p) quadruple set,'s assn,('s,'p,'f) com, 's assn] => bool"
   ((3_,_/|-t(_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoaret_emptyCtx_noAbr"::
"[('s,'p,'f) body,'f set,'s assn,('s,'p,'f) com, 's assn] => bool"
   ((3_/|-t'/_ (_/ (_)/ _)) [61,60,1000,20,1000]60)

"_hoaret_emptyCtx_noAbr_emptyFaults"::
"[('s,'p,'f) body,'s assn,('s,'p,'f) com, 's assn] => bool"
   ((3_/|-t(_/ (_)/ _)) [61,1000,20,1000]60)

translations


  P c Q,A"  == {} P c Q,A"
 F P c Q,A"  == "Γ,{}F P c Q,A"

 "Γ,Θ P c Q"  == "Γ,Θ{} P c Q"
 "Γ,ΘF P c Q"  == "Γ,ΘF P c Q,{}"
 "Γ,Θ P c Q,A" == "Γ,Θ{} P c Q,A"

  P c Q"    ==  {} P c Q"
 F P c Q"  == "Γ,{}F P c Q"
 F P c Q"  <=  F P c Q,{}"
  P c Q"    <=   P c Q,{}"




 t P c Q,A"   == t{} P c Q,A"
 tF P c Q,A"  == "Γ,{}tF P c Q,A"

 "Γ,Θt P c Q"   == "Γ,Θt{} P c Q"
 "Γ,ΘtF P c Q" == "Γ,ΘtF P c Q,{}"
 "Γ,Θt P c Q,A"   == "Γ,Θt{} P c Q,A"

 t P c Q"    == t{} P c Q"
 tF P c Q"  == "Γ,{}tF P c Q"
 tF P c Q"  <=  tF P c Q,{}"
 t P c Q"    <=  t P c Q,{}"


term  P c Q"
term  P c Q,A"

term F P c Q"
term F P c Q,A"

term "Γ,Θ P c Q"
term "Γ,ΘF P c Q"

term "Γ,Θ P c Q,A"
term "Γ,ΘF P c Q,A"


term t P c Q"
term t P c Q,A"

term tF P c Q"
term tF P c Q,A"

term "Γ,Θ P c Q"
term "Γ,ΘtF P c Q"

term "Γ,Θ P c Q,A"
term "Γ,ΘtF P c Q,A"


locale hoare =
  fixes Γ::"('s,'p,'f) body"


primrec assoc:: "('a ×'b) list ==> 'a ==> 'b "
where
"assoc [] x = undefined" |
"assoc (p#ps) x = (if fst p = x then (snd p) else assoc ps x)"

lemma conjE_simp: "(P Q ==> PROP R) (P ==> Q ==> PROP R)"
  by rule simp_all

lemma CollectInt_iff: "{s. P s} {s. Q s} = {s. P s Q s}"
  by auto

lemma Compl_Collect:"-(Collect b) = {x. ¬(b x)}"
  by fastforce

lemma Collect_False: "{s. False} = {}"
  by simp

lemma Collect_True: "{s. True} = UNIV"
  by simp

lemma triv_All_eq: "x. P P"
  by simp

lemma triv_Ex_eq: "x. P P"
  by simp

lemma Ex_True: "b. b"
   by blast

lemma Ex_False: "b. ¬b"
  by blast

definition mex::"('a ==> bool) ==> bool"
  where "mex P = Ex P"

definition meq::"'a ==> 'a ==> bool"
  where "meq s Z = (s = Z)"

lemma subset_unI1: "A B ==> A B C"
  by blast

lemma subset_unI2: "A C ==> A B C"
  by blast

lemma split_paired_UN: "(p. (P p)) = (a b. (P (a,b)))"
  by auto

lemma in_insert_hd: "f insert f X"
  by simp

lemma lookup_Some_in_dom: "Γ p = Some bdy ==> p dom Γ"
  by auto

lemma unit_object: "(u::unit. P u) = P ()"
  by auto

lemma unit_ex: "(u::unit. P u) = P ()"
  by auto

lemma unit_meta: "((u::unit). PROP P u) PROP P ()"
  by auto

lemma unit_UN: "(z::unit. P z) = P ()"
  by auto

lemma subset_singleton_insert1: "y = x ==> {y} insert x A"
  by auto

lemma subset_singleton_insert2: "{y} A ==> {y} insert x A"
  by auto

lemma in_Specs_simp: "(xZ. {(P Z, p, Q Z, A Z)}. Prop x) =
       (Z. Prop (P Z,p,Q Z,A Z))"
  by auto

lemma in_set_Un_simp: "(xA B. P x) = ((x A. P x) (x B. P x))"
  by auto

lemma split_all_conj: "(x. P x Q x) = ((x. P x) (x. Q x))"
  by blast

lemma image_Un_single_simp: "f ` (Z. {P Z}) = (Z. {f (P Z)}) "
  by auto



lemma measure_lex_prod_def':
  "f <*mlex*> r ({(x,y). (x,y) measure f f x=f y (x,y) r})"
  by (auto simp add: mlex_prod_def inv_image_def)

lemma in_measure_iff: "(x,y) measure f = (f x < f y)"
  by (simp add: measure_def inv_image_def)

lemma in_lex_iff:
  "((a,b),(x,y)) r <*lex*> s = ((a,x) r (a=x (b,y)s))"
  by (simp add: lex_prod_def)

lemma in_mlex_iff:
  "(x,y) f <*mlex*> r = (f x < f y (f x=f y (x,y) r))"
  by (simp add: measure_lex_prod_def' in_measure_iff)

lemma in_inv_image_iff: "(x,y) inv_image r f = ((f x, f y) r)"
  by (simp add: inv_image_def)

text This is actually the same as @{thm [source] wf_mlex}. However, this basic
  took me so long that I'm not willing to delete it.
 

lemma wf_measure_lex_prod [simp,intro]:
  assumes wf_r: "wf r"
  shows "wf (f <*mlex*> r)"
proof (rule ccontr)
  assume " ¬ wf (f <*mlex*> r)"
  then
  obtain g where "i. (g (Suc i), g i) f <*mlex*> r"
    by (auto simp add: wf_iff_no_infinite_down_chain)
  hence g: "i. (g (Suc i), g i) measure f
    f (g (Suc i)) = f (g i) (g (Suc i), g i) r"
    by (simp add: measure_lex_prod_def')
  hence le_g: "i. f (g (Suc i)) f (g i)"
    by (auto simp add: in_measure_iff order_le_less)
  have "wf (measure f)"
    by simp
  hence " Q. (x. x Q) (zQ. y. (y, z) measure f y Q)"
    by (simp add: wf_eq_minimal)
  from this [rule_format, of "g ` UNIV"]
  have "z. z range g (y. (y, z) measure f y range g)"
    by auto
  then obtain z where
    z: "z range g" and
    min_z: "y. f y < f z y range g"
    by (auto simp add: in_measure_iff)
  from z obtain k where
    k: "z = g k"
    by auto
  have "i. k i f (g i) = f (g k)"
  proof (intro allI impI)
    fix i
    assume "k i" then show "f (g i) = f (g k)"
    proof (induct i)
      case 0
      have "k 0" by fact hence "k = 0" by simp
      thus "f (g 0) = f (g k)"
        by simp
    next
      case (Suc n)
      have k_Suc_n: "k Suc n" by fact
      then show "f (g (Suc n)) = f (g k)"
      proof (cases "k = Suc n")
        case True
        thus ?thesis by simp
      next
        case False
        with k_Suc_n
        have "k n"
          by simp
        with Suc.hyps
        have n_k: "f (g n) = f (g k)" by simp
        from le_g have le: "f (g (Suc n)) f (g n)"
          by simp
        show ?thesis
        proof (cases "f (g (Suc n)) = f (g n)")
          case True with n_k show ?thesis by simp
        next
          case False
          with le have "f (g (Suc n)) < f (g n)"
            by simp
          with n_k k have "f (g (Suc n)) < f z"
            by simp
          with min_z have "g (Suc n) range g"
            by blast
          hence False by simp
          thus ?thesis
            by simp
        qed
      qed
    qed
  qed
  with k [symmetric] have "i. k i f (g i) = f z"
    by simp
  hence "i. k i f (g (Suc i)) = f (g i)"
    by simp
  with g have "i. k i (g (Suc i),(g i)) r"
    by (auto simp add: in_measure_iff order_less_le )
  hence "i. (g (Suc (i+k)),(g (i+k))) r"
    by simp
  then
  have "f. i. (f (Suc i), f i) r"
    by - (rule exI [where x="λi. g (i+k)"],simp)
  with wf_r show False
    by (simp add: wf_iff_no_infinite_down_chain)
qed

lemmas all_imp_to_ex = all_simps (5)
(*"\<And>P Q. (\<forall>x. P x \<longrightarrow> Q) = ((\<exists>x. P x) \<longrightarrow> Q)"

 Avoid introduction of existential quantification of states on negative
 position.
*)


lemma all_imp_eq_triv: "(x. x = k Q) = Q"
                       "(x. k = x Q) = Q"
  by auto

end

Messung V0.5 in Prozent
C=95 H=99 G=96

¤ Dauer der Verarbeitung: 0.7 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.