section ‹ Relational Operational Semantics ›
theory utp_rel_opsem
imports
utp_rel_laws
utp_hoare
begin
text ‹ This theory uses the laws of relational calculus to create a basic operational semantics.
It is based on Chapter 10 of the UTP book~cite‹"Hoare&98"›. ›
fun trel :: "'α usubst × 'α hrel → 'α usubst × 'α hrel → bool" (infix ‹→u› 85) where
"(σ, P) →u (ρ, Q) ⟷ (⟨σ⟩a ;; P) ⊑ (⟨ρ⟩a ;; Q)"
lemma trans_trel:
"[ (σ, P) →u (ρ, Q); (ρ, Q) →u (φ, R) ] ==> (σ, P) →u (φ, R)"
by auto
lemma skip_trel: "(σ, II) →u (σ, II)"
by simp
lemma assigns_trel: "(σ, ⟨ρ⟩a) →u (ρ ∘ σ, II)"
by (simp add: assigns_comp)
lemma assign_trel:
"(σ, x := v) →u (σ(&x ↦s σ † v), II)"
by (simp add: assigns_comp usubst)
lemma seq_trel:
assumes "(σ, P) →u (ρ, Q)"
shows "(σ, P ;; R) →u (ρ, Q ;; R)"
by (metis (no_types, lifting) assms order_refl seqr_assoc seqr_mono trel.simps)
lemma seq_skip_trel:
"(σ, II ;; P) →u (σ, P)"
by simp
lemma nondet_left_trel:
"(σ, P ⊓ Q) →u (σ, P)"
by (metis (no_types, opaque_lifting) disj_comm disj_upred_def semilattice_sup_class.sup.absorb_iff1 semilattice_sup_class.sup.left_idem seqr_or_distr trel.simps)
lemma nondet_right_trel:
"(σ, P ⊓ Q) →u (σ, Q)"
by (simp add: seqr_mono)
lemma rcond_true_trel:
assumes "σ † b = true"
shows "(σ, P ◃ b ▹r Q) →u (σ, P)"
using assms
by (simp add: assigns_r_comp usubst alpha cond_unit_T)
lemma rcond_false_trel:
assumes "σ † b = false"
shows "(σ, P ◃ b ▹r Q) →u (σ, Q)"
using assms
by (simp add: assigns_r_comp usubst alpha cond_unit_F)
lemma while_true_trel:
assumes "σ † b = true"
shows "(σ, while b do P od) →u (σ, P ;; while b do P od)"
by (metis assms rcond_true_trel while_unfold)
lemma while_false_trel:
assumes "σ † b = false"
shows "(σ, while b do P od) →u (σ, II)"
by (metis assms rcond_false_trel while_unfold)
text ‹ Theorem linking Hoare calculus and operational semantics. If we start $Q$ in a state $\sigma_0$
satisfying $p$, and $Q$ reaches final state $\sigma_1$ then $r$ holds in this final state. ›
theorem hoare_opsem_link:
"{p}Q{r}u = (∀ σ0 σ1. `σ0 † p` ∧ (σ0, Q) →u (σ1, II) ⟶ `σ1 † r`)"
apply (rel_auto)
apply (rename_tac a b)
apply (drule_tac x="λ _. a" in spec, simp)
apply (drule_tac x="λ _. b" in spec, simp)
done
declare trel.simps [simp del]
end
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland