|
9 | 9 | public import Cslib.Foundations.Relation.Domain |
10 | 10 | public import Cslib.Foundations.Semantics.LTS.Simulation |
11 | 11 | public import Cslib.Foundations.Semantics.LTS.TraceEq |
| 12 | +public import Mathlib.Tactic.TFAE |
12 | 13 |
|
13 | 14 | /-! # Bisimulation and Bisimilarity |
14 | 15 |
|
@@ -183,6 +184,10 @@ instance : IsEquiv State (HomBisimilarity lts) where |
183 | 184 | symm _ _ := Bisimilarity.symm |
184 | 185 | trans _ _ _ := Bisimilarity.trans |
185 | 186 |
|
| 187 | +/-- Bisimulation implies simulation equivalence. -/ |
| 188 | +theorem IsBisimulation.simulationEquiv (h : IsBisimulation lts₁ lts₂ r) (hrel : r s₁ s₂) : |
| 189 | + s₁ ≤≥[lts₁,lts₂] s₂ := ⟨⟨r, hrel, h.isSimulation⟩, flip r, hrel, h.inv.isSimulation⟩ |
| 190 | + |
186 | 191 | /-- The union of two bisimulations is a bisimulation. -/ |
187 | 192 | @[scoped grind .] |
188 | 193 | theorem IsBisimulation.sup (hrb : IsBisimulation lts₁ lts₂ r) (hsb : IsBisimulation lts₁ lts₂ s) : |
@@ -302,30 +307,16 @@ theorem IsBisimulationUpTo.isBisimulation (h : IsBisimulationUpTo lts₁ lts₂ |
302 | 307 |
|
303 | 308 | /-- If two states are related by a bisimulation, they can mimic each other's multi-step |
304 | 309 | transitions. -/ |
305 | | -theorem IsBisimulation.bisim_trace |
306 | | - (hb : IsBisimulation lts₁ lts₂ r) (hr : r s₁ s₂) : |
| 310 | +theorem IsBisimulation.bisim_trace (hb : IsBisimulation lts₁ lts₂ r) (hr : r s₁ s₂) : |
307 | 311 | ∀ μs s₁', lts₁.MTr s₁ μs s₁' → ∃ s₂', lts₂.MTr s₂ μs s₂' ∧ r s₁' s₂' := |
308 | 312 | hb.isSimulation.sim_trace hr |
309 | 313 |
|
310 | 314 | /-! ## Relation to trace equivalence -/ |
311 | 315 |
|
312 | 316 | /-- Any bisimulation implies trace equivalence. -/ |
313 | 317 | @[scoped grind =>] |
314 | | -theorem IsBisimulation.traceEq |
315 | | - (hb : IsBisimulation lts₁ lts₂ r) (hr : r s₁ s₂) : |
316 | | - s₁ ~tr[lts₁,lts₂] s₂ := by |
317 | | - ext μs |
318 | | - constructor |
319 | | - case mp => |
320 | | - intro h |
321 | | - obtain ⟨s₁', h⟩ := h |
322 | | - obtain ⟨s₂', hmtr⟩ := IsBisimulation.bisim_trace hb hr μs s₁' h |
323 | | - use s₂', hmtr.1 |
324 | | - case mpr => |
325 | | - intro h |
326 | | - obtain ⟨s₂', h⟩ := h |
327 | | - obtain ⟨s₁', hmtr⟩ := IsBisimulation.bisim_trace hb.inv hr μs s₂' h |
328 | | - use s₁', hmtr.1 |
| 318 | +theorem IsBisimulation.traceEq (hb : IsBisimulation lts₁ lts₂ r) (hr : r s₁ s₂) : |
| 319 | + s₁ ~tr[lts₁,lts₂] s₂ := (hb.simulationEquiv hr).traceEq |
329 | 320 |
|
330 | 321 | /-- Bisimilarity is included in trace equivalence. -/ |
331 | 322 | @[scoped grind .] |
@@ -412,30 +403,30 @@ theorem IsBisimulation.deterministic_traceEq_isBisimulation |
412 | 403 | [lts₁.Deterministic] [lts₂.Deterministic] : |
413 | 404 | (IsBisimulation lts₁ lts₂ (TraceEq lts₁ lts₂)) := by |
414 | 405 | rw [IsBisimulation.isSimulation_iff, TraceEq.flip_eq] |
415 | | - exact ⟨TraceEq.deterministic_isSimulation, TraceEq.deterministic_isSimulation⟩ |
| 406 | + exact ⟨Deterministic.isSimulation_traceEq, Deterministic.isSimulation_traceEq⟩ |
416 | 407 |
|
417 | 408 | /-- In deterministic LTSs, trace equivalence implies bisimilarity. -/ |
418 | 409 | theorem Bisimilarity.deterministic_traceEq_bisim {lts₁ : LTS State₁ Label} {lts₂ : LTS State₂ Label} |
419 | 410 | [lts₁.Deterministic] [lts₂.Deterministic] (h : s₁ ~tr[lts₁,lts₂] s₂) : |
420 | 411 | (s₁ ~[lts₁,lts₂] s₂) := by |
421 | | - exists TraceEq lts₁ lts₂ |
422 | | - constructor |
423 | | - case left => |
424 | | - exact h |
425 | | - case right => |
426 | | - apply IsBisimulation.deterministic_traceEq_isBisimulation |
| 412 | + use TraceEq lts₁ lts₂, h, IsBisimulation.deterministic_traceEq_isBisimulation |
| 413 | + |
| 414 | +/-- In a deterministic lts, bisimilarity, trace equivalence, and simulation equivalence are |
| 415 | +equivalent to one-another. -/ |
| 416 | +theorem Deterministic.bisim_tfae {lts₁ : LTS State₁ Label} {lts₂ : LTS State₂ Label} |
| 417 | + [lts₁.Deterministic] [lts₂.Deterministic] (s₁ : State₁) (s₂ : State₂) : |
| 418 | + [s₁ ~[lts₁,lts₂] s₂, s₁ ~tr[lts₁,lts₂] s₂, s₁ ≤≥[lts₁,lts₂] s₂].TFAE := by |
| 419 | + tfae_have 2 ↔ 3 := Deterministic.traceEq_iff_simulationEquiv s₁ s₂ |
| 420 | + tfae_have 1 → 2 := Bisimilarity.le_traceEq s₁ s₂ |
| 421 | + tfae_have 2 → 1 := Bisimilarity.deterministic_traceEq_bisim |
| 422 | + tfae_finish |
427 | 423 |
|
428 | 424 | /-- In deterministic LTSs, bisimilarity and trace equivalence coincide. -/ |
429 | 425 | theorem Bisimilarity.deterministic_bisim_eq_traceEq |
430 | 426 | {lts₁ : LTS State₁ Label} {lts₂ : LTS State₂ Label} |
431 | 427 | [lts₁.Deterministic] [lts₂.Deterministic] : Bisimilarity lts₁ lts₂ = TraceEq lts₁ lts₂ := by |
432 | | - funext s₁ s₂ |
433 | | - simp only [eq_iff_iff] |
434 | | - constructor |
435 | | - case mp => |
436 | | - apply Bisimilarity.le_traceEq |
437 | | - case mpr => |
438 | | - apply Bisimilarity.deterministic_traceEq_bisim |
| 428 | + ext s₁ s₂ |
| 429 | + exact (Deterministic.bisim_tfae s₁ s₂).out 0 1 |
439 | 430 |
|
440 | 431 | /-- Homogeneous bisimilarity can also be characterized through symmetric simulations. -/ |
441 | 432 | theorem HomBisimilarity.symm_simulation : |
|
0 commit comments