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

Quelle  Big_StepT.thy

  Sprache: Isabelle
 

section "Big Step Semantics with Time"
theory Big_StepT imports Big_Step begin

subsection "Big-Step with Time Semantics of Commands"

inductive
  big_step_t :: "com × state ==> nat ==> state ==> bool"  (_ ==> _ _ 55)
where
Skip: "(SKIP,s) ==> Suc 0 s" |
Assign: "(x ::= a,s) ==> Suc 0 s(x := aval a s)" |
Seq: "[ (c1,s1) ==> x s2; (c2,s2) ==> y s3 ; z=x+y ] ==> (c1;;c2, s1) ==> z s3" |
IfTrue: "[ bval b s; (c1,s) ==> x t; y=x+1 ] ==> (IF b THEN c1 ELSE c2, s) ==> y t" |
IfFalse: "[ ¬bval b s; (c2,s) ==> x t; y=x+1 ] ==> (IF b THEN c1 ELSE c2, s) ==> y t" |
WhileFalse: "[ ¬bval b s ] ==> (WHILE b DO c,s) ==> Suc 0 s" |
WhileTrue: "[ bval b s1; (c,s1) ==> x s2; (WHILE b DO c, s2) ==> y s3; 1+x+y=z ]
    ==> (WHILE b DO c, s1) ==> z s3"


textWe want to execute the big-step rules:

code_pred big_step_t .

textFor inductive definitions we need command
 \texttt{values} instead of \texttt{value}.


values "{(t, x). (SKIP, λ_. 0) ==> x t}"

textWe need to translate the result state into a list
  display it.


values "{map t [''x''] |t x. (SKIP, <''x'' := 42>) ==> x t}"

values "{map t [''x''] |t x. (''x'' ::= N 2, <''x'' := 42>) ==> x t}"

values "{map t [''x'',''y''] |t x.
  (WHILE Less (V ''x'') (V ''y'') DO (''x'' ::= Plus (V ''x'') (N 5)),
   <''x'' := 0, ''y'' := 13>) ==> x t}"


textProof automation:
 
declare big_step_t.intros [intro]
  
lemmas big_step_t_induct = big_step_t.induct[split_format(complete)]

subsection "Rule inversion"

textWhat can we deduce from @{prop "(SKIP,s) ==> x t"} ?
  @{prop "s = t"}. This is how we can automatically prove it:


inductive_cases Skip_tE[elim!]: "(SKIP,s) ==> x t"
thm Skip_tE

textThis is an \emph{elimination rule}. The [elim] attribute tells auto,
  and friends (but not simp!) to use it automatically; [elim!] means that
  is applied eagerly.

  for the other commands:


inductive_cases Assign_tE[elim!]: "(x ::= a,s) ==> p t"
thm Assign_tE
inductive_cases Seq_tE[elim!]: "(c1;;c2,s1) ==> p s3"
thm Seq_tE
inductive_cases If_tE[elim!]: "(IF b THEN c1 ELSE c2,s) ==> x t"
thm If_tE

inductive_cases While_tE[elim]: "(WHILE b DO c,s) ==> x t"
thm While_tE
textOnly [elim]: [elim!] would not terminate.

textAn automatic example:

lemma "(IF b THEN SKIP ELSE SKIP, s) ==> x t ==> t = s"
by blast

textRule inversion by hand via the ``cases'' method:

lemma assumes "(IF b THEN SKIP ELSE SKIP, s) ==> x t"
shows "t = s"
proof-
  from assms show ?thesis
  proof cases  ― inverting assms
    case IfTrue
    thus ?thesis by blast
  next
    case IfFalse thus ?thesis by blast
  qed
qed

(* Using rule inversion to prove simplification rules: *)
lemma assign_t_simp:
  "(x ::= a,s) ==> Suc 0 s' (s' = s(x := aval a s))"
  by (auto)

text An example combining rule inversion and derivations
lemma Seq_t_assoc:
  "((c1;; c2;; c3, s) ==> p s') ((c1;; (c2;; c3), s) ==> p s')"
proof
  assume "(c1;; c2;; c3, s) ==> p s'"
  then obtain s1 s2 p1 p2 p3 where
    c1: "(c1, s) ==> p1 s1" and
    c2: "(c2, s1) ==> p2 s2" and
    c3: "(c3, s2) ==> p3 s'" and
    p: "p = p1 + (p2 + p3)" by auto
  from c2 c3
  have "(c2;; c3, s1) ==> p2 + p3 s'" apply (rule Seq) by simp
  with c1
  show "(c1;; (c2;; c3), s) ==> p s'" unfolding p apply (rule Seq) by simp
next
  ― The other direction is analogous
  assume "(c1;; (c2;; c3), s) ==> p s'"
  then obtain s1 s2 p1 p2 p3 where
    c1: "(c1, s) ==> p1 s1" and
    c2: "(c2, s1) ==> p2 s2" and
    c3: "(c3, s2) ==> p3 s'" and
    p: "p = (p1 + p2) + p3" by auto
  from c1 c2
  have "(c1;; c2, s) ==> p1 + p2 s2" apply (rule Seq) by simp
  from this c3
  show "(c1;; c2;; c3, s) ==> p s'" unfolding p apply (rule Seq) by simp
qed


subsection "Relation to Big-Step Semantics"

lemma "(p. ((c, s) ==> p s')) = ((c, s) ==> s')"
proof 
    assume "p. (c, s) ==> p s'"
    then obtain p where "(c, s) ==> p s'"
by blast
    then show "((c, s) ==> s')"
      apply(induct c s p s' rule: big_step_t_induct)
        prefer 2 apply(rule Big_Step.Assign)
        apply(auto) done
next
  assume "((c, s) ==> s')"
  then show "(p. ((c, s) ==> p s'))"
    apply(induct c s s' rule: big_step_induct)
      by blast+
qed

 
subsection "Execution is deterministic"

text This proof is automatic.

theorem big_step_t_determ: "[ (c,s) ==> p t; (c,s) ==> q u ] ==> u = t"
  apply (induction arbitrary: u q rule: big_step_t.induct)
  apply blast+ done
 

theorem big_step_t_determ2: "[ (c,s) ==> p t; (c,s) ==> q u ] ==> (u = t p=q)"
  apply  (induction arbitrary: u q rule: big_step_t_induct) 
    apply(elim Skip_tE) apply(simp)
    apply(elim Assign_tE) apply(simp)
  apply blast
    apply(elim If_tE) apply(simp) apply blast
    apply(elim If_tE)  apply blast apply(simp)
    apply(erule While_tE) apply(simp) apply blast
    proof (goal_cases)
      case 1
      from 1(7show ?case apply(safe) 
        apply(erule While_tE)
          using 1(1-6apply fast
          using 1(1-6apply (simp)
        apply(erule While_tE)
          using 1(1-6apply fast
          using 1(1-6by (simp)
     qed
         
       
lemma bigstep_det: "(c1, s) ==> p1 t1 ==> (c1, s) ==> p t ==> p1=p t1=t"
  using big_step_t_determ2 by simp


lemma bigstep_progress: "(c, s) ==> p t ==> p > 0"
apply(induct rule: big_step_t.induct, auto) done

abbreviation terminates (where "terminates cs (n a. (cs ==> n a))"
abbreviation thestate (swhere "thestate cs (THE a. n. (cs ==> n a))" 
abbreviation thetime (twhere "thetime cs (THE n. a. (cs ==> n a))"  
            
  
lemma bigstepT_the_cost: "(c, s) ==> t s' ==> t(c, s) = t"
  using bigstep_det by blast 

lemma bigstepT_the_state: "(c, s) ==> t s' ==> s(c, s) = s'"
  using bigstep_det by blast 


lemma SKIPnot: "(¬ (SKIP, s) ==> p t) = (st pSuc 0)" by blast

 
lemma SKIPp: "t(SKIP,s) = Suc 0"
  apply(rule the_equality)
  apply fast
  apply auto done 

lemma SKIPt: "s(SKIP,s) = s"
  apply(rule the_equality)
  apply fast
  apply auto done 


lemma ASSp: "(THE p. Ex (big_step_t (x ::= e, s) p)) = Suc 0"
  apply(rule the_equality)
  apply fast
  apply auto done 

lemma ASSt: "(THE t. p. (x ::= e, s) ==> p t) = s(x := aval e s)"
  apply(rule the_equality)
  apply fast
  apply auto done 

lemma ASSnot: "( ¬ (x ::= e, s) ==> p t ) = (pSuc 0 ts(x := aval e s))"
  apply auto done
       
    
    
lemma If_THE_True: "Suc (THE n. a. (c1, s) ==> n a) = (THE n. a. (IF b THEN c1 ELSE c2, s) ==> n a)"
     if T: "bval b s" and c1_t: "terminates (c1,s)" for s l
proof -
  from c1_t obtain p t where a: "(c1, s) ==> p t" by blast
  with T have b: "(IF b THEN c1 ELSE c2, s) ==> p+1 t"  using IfTrue by simp
  from a bigstepT_the_cost have "(THE n. a. (c1, s) ==> n a) = p" by simp
moreover    
  from b bigstepT_the_cost have "(THE n. a. (IF b THEN c1 ELSE c2, s) ==> n a) = p+1" by simp
ultimately
  show ?thesis by simp
qed

lemma If_THE_False: "Suc (THE n. a. (c2, s) ==> n a) = (THE n. a. (IF b THEN c1 ELSE c2, s) ==> n a)"
     if T: "¬bval b s" and c2_t: " (c2,s)" for s l
proof -
  from c2_t obtain p t where a: "(c2, s) ==> p t"  by blast
  with T have b: "(IF b THEN c1 ELSE c2, s) ==> p+1 t"  using IfFalse by simp
  from a bigstepT_the_cost have "(THE n. a. (c2, s) ==> n a) = p" by simp
moreover    
  from b bigstepT_the_cost have "(THE n. a. (IF b THEN c1 ELSE c2, s) ==> n a) = p+1" by simp
ultimately
  show ?thesis by simp
qed
    
  
end

Messung V0.5 in Prozent
C=72 H=100 G=86

¤ Dauer der Verarbeitung: 0.2 Sekunden  (vorverarbeitet am  2026-06-10) ¤

*© 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.