Theory Coupledsim_Fixpoint_Algo_Delay
section ‹Fixed Point Algorithm for Coupled Similarity›
subsection ‹The Algorithm›
theory Coupledsim_Fixpoint_Algo_Delay
imports
Coupled_Simulation
"HOL-Library.While_Combinator"
"HOL-Library.Finite_Lattice"
begin
context lts_tau
begin
definition fp_step ::
‹'s rel ⇒ 's rel›
where
‹fp_step R1 ≡ { (p,q)∈R1.
(∀ p' a. p ⟼a p' ⟶
(tau a ⟶ (p',q)∈R1) ∧
(¬tau a ⟶ (∃ q'. ((p',q')∈R1) ∧ (q =⊳a q')))) ∧
(∃ q'. q ⟼*tau q' ∧ ((q',p)∈R1)) }›
definition fp_compute_cs :: ‹'s rel›
where ‹fp_compute_cs ≡ while (λR. fp_step R ≠ R) fp_step top›
subsection ‹Correctness›
lemma mono_fp_step:
‹mono fp_step›
proof (rule, safe)
fix x y::‹'s rel› and p q
assume
‹x ⊆ y›
‹(p, q) ∈ fp_step x›
thus ‹(p, q) ∈ fp_step y›
unfolding fp_step_def
by (auto, blast)
qed
lemma fp_fp_step:
assumes
‹R = fp_step R›
shows
‹coupled_delay_simulation (λ p q. (p, q) ∈ R)›
using assms unfolding fp_step_def coupled_delay_simulation_def delay_simulation_def
by (auto, blast, fastforce+)
lemma gfp_fp_step_subset_gcs:
shows ‹(gfp fp_step) ⊆ { (p,q) . greatest_coupled_simulation p q }›
unfolding gcs_eq_coupled_sim_by[symmetric]
proof clarify
fix a b
assume
‹(a, b) ∈ gfp fp_step›
thus ‹a ⊑cs b›
unfolding coupled_sim_by_eq_coupled_delay_simulation
using fp_fp_step mono_fp_step gfp_unfold
by metis
qed
lemma fp_fp_step_gcs:
assumes
‹R = { (p,q) . greatest_coupled_simulation p q }›
shows
‹fp_step R = R›
unfolding assms
proof safe
fix p q
assume
‹(p, q) ∈ fp_step {(x, y). greatest_coupled_simulation x y}›
hence
‹(∀p' a. p ⟼a p' ⟶
(tau a ⟶ greatest_coupled_simulation p' q) ∧
(¬tau a ⟶ (∃q'. greatest_coupled_simulation p' q' ∧ q =⊳a q'))) ∧
(∃q'. q ⟼* tau q' ∧ greatest_coupled_simulation q' p)›
unfolding fp_step_def by auto
hence ‹(∀p' a. p ⟼a p' ⟶ (∃q'. greatest_coupled_simulation p' q' ∧ q ⇒^a q')) ∧
(∃q'. q ⟼* tau q' ∧ greatest_coupled_simulation q' p)›
unfolding fp_step_def using weak_step_delay_implies_weak_tau steps.refl by blast
hence ‹(∀p' a. p ⟼a p' ⟶ (∃q'. greatest_coupled_simulation p' q' ∧ q ⇒^^a q')) ∧
(∃q'. q ⟼* tau q' ∧ greatest_coupled_simulation q' p)›
using weak_step_tau2_def by simp
thus ‹greatest_coupled_simulation p q›
using lts_tau.gcs by metis
next
fix p q
assume asm:
‹greatest_coupled_simulation p q›
then have ‹(p, q) ∈ {(x, y). greatest_coupled_simulation x y}› by blast
moreover from asm have ‹∃ R. R p q ∧ coupled_delay_simulation R›
unfolding gcs_eq_coupled_sim_by[symmetric] coupled_sim_by_eq_coupled_delay_simulation.
then obtain R where ‹R p q› ‹coupled_delay_simulation R› by blast
moreover then have ‹∀ p' a. p ⟼a p' ∧ ¬tau a ⟶
(∃ q'. (greatest_coupled_simulation p' q') ∧ (q =⊳a q'))›
using coupled_delay_simulation_def delay_simulation_def
by (metis coupled_similarity_implies_gcs coupled_simulation_weak_simulation
delay_simulation_implies_weak_simulation)
moreover from asm have ‹∀ p' a. p ⟼a p' ∧ tau a ⟶ greatest_coupled_simulation p' q›
unfolding gcs_eq_coupled_sim_by[symmetric] coupled_sim_by_eq_coupled_delay_simulation
by (metis coupled_delay_simulation_def delay_simulation_def)
moreover have ‹(∃ q'. q ⟼*tau q' ∧ (greatest_coupled_simulation q' p))›
using asm gcs_is_coupled_simulation coupled_simulation_implies_coupling by blast
ultimately show ‹(p, q) ∈ fp_step {(x, y). greatest_coupled_simulation x y}›
unfolding fp_step_def by blast
qed
lemma gfp_fp_step_gcs: ‹gfp fp_step = { (p,q) . greatest_coupled_simulation p q }›
using fp_fp_step_gcs gfp_fp_step_subset_gcs
by (simp add: equalityI gfp_upperbound)
end
context lts_tau_finite
begin
lemma gfp_fp_step_while:
shows
‹gfp fp_step = fp_compute_cs›
unfolding fp_compute_cs_def
using gfp_while_lattice[OF mono_fp_step] finite_state_rel Finite_Set.finite_set by blast
theorem coupled_sim_fp_step_while:
shows ‹fp_compute_cs = { (p,q) . greatest_coupled_simulation p q }›
using gfp_fp_step_while gfp_fp_step_gcs by blast
end
end