{-# OPTIONS --safe #-} module Multiset.ListQuotient.Bisimilarity where open import Multiset.Prelude open import Multiset.Setoid.Base as Setoid using (Setoid) open import Multiset.Relation.Base using (Relation ; RelationStr ; IsRelation) open import Multiset.ListQuotient.ListFinality using ( FunctorΣVec ; !^ ; cut ; Tree ; isSetTree ) open import Multiset.Util.BundledVec as BVec using ( ΣVec ; Relator ; isReflRelator ; isSymRelator ; isTransRelator ; isPropRelator ; Relator-map ) open import Multiset.Util.Relation using ( Tot ; isPropTot ; isReflTot ; isSymTot ; isTransTot ) open import Multiset.Limit.Chain using ( lim ; Limit ; Chain ; isPropChain→Limit ; isOfHLevelLimit ) open import Multiset.Limit.TerminalChain as TerminalChain using ( Functor ; Lim ; ShLim ; _^_ ) open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function using (_∘_) open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Data.Nat.Base as Nat using (ℕ ; suc ; zero) open import Cubical.Data.Unit.Base using (Unit* ; tt*) open import Cubical.Relation.Binary using (module BinaryRelation ; Rel) open BVec.ΣVec open Limit using (elements ; is-lim) open Iso open Functor ⦃...⦄ Approx : (n : ℕ) → Rel (ΣVec ^ n) (ΣVec ^ n) ℓ-zero Approx zero = Tot Unit* _ Approx (suc n) = Relator (Approx n) isPropApprox : ∀ n (s t : ΣVec ^ n) → isProp (Approx n s t) isPropApprox zero = isPropTot isPropApprox (suc n) s t = isPropRelator (Approx n) Approx-π : ∀ n {s t} → Approx (suc n) s t → Approx n (!^ n s) (!^ n t) Approx-π zero _ = tt* Approx-π (suc n) rel = Relator-map (Approx (suc n)) _ (Approx-π n) rel RelatorLim^ : ℕ → (s t : Lim ΣVec) → Type RelatorLim^ n s t = Approx n (cut n s) (cut n t) isPropRelatorLim^ : ∀ s t n → isProp (RelatorLim^ n s t) isPropRelatorLim^ s t n = isPropApprox n (cut n s) (cut n t) module _ (s t : Lim ΣVec) where RelatorLimSuc→RelatorLim : ∀ n → RelatorLim^ (suc n) s t → RelatorLim^ n s t RelatorLimSuc→RelatorLim n rel = subst2 (Approx n) (s .is-lim n) (t .is-lim n) (Approx-π n rel) BisimChain : Chain ℓ-zero BisimChain .Chain.Ob n = RelatorLim^ n s t BisimChain .Chain.π = RelatorLimSuc→RelatorLim Bisim : Type Bisim = Limit BisimChain Bisim→Approx : (n : ℕ) → Bisim → Approx n (cut n s) (cut n t) Bisim→Approx n s≈t = s≈t .elements n isPropBisim : isProp Bisim isPropBisim = isOfHLevelLimit _ 1 (isPropRelatorLim^ s t) bisim : {s t : Lim ΣVec} → (∀ n → RelatorLim^ n s t) → Bisim s t bisim {s} {t} = isPropChain→Limit (BisimChain s t) (isPropRelatorLim^ s t) ShBisimChain : (s t : ShLim ΣVec) → Chain ℓ-zero ShBisimChain s t .Chain.Ob n = Approx (suc n) (s .elements n) (t .elements n) ShBisimChain s t .Chain.π n rel = subst2 (Approx (suc n)) (s .is-lim n) (t .is-lim n) (Approx-π (suc n) rel) ShBisim : Rel (ShLim ΣVec) (ShLim ΣVec) ℓ-zero ShBisim s t = Limit (ShBisimChain s t) shbisim : {s t : ShLim ΣVec} → (∀ n → Approx (suc n) (s .elements n) (t .elements n)) → ShBisim s t shbisim {s} {t} = isPropChain→Limit (ShBisimChain s t) λ n → isPropRelator (Approx n) infix 5 _≈_ _≈ˢʰ_ _≈_ = Bisim _≈ˢʰ_ = ShBisim syntax RelatorLim^ n s t = s ≈[ n ] t module _ where open BinaryRelation isReflApprox : ∀ n → isRefl (Approx n) isReflApprox zero = isReflTot isReflApprox (suc n) = isReflRelator (isReflApprox n) isSymApprox : ∀ n → isSym (Approx n) isSymApprox zero = isSymTot isSymApprox (suc n) = isSymRelator (isSymApprox n) isTransApprox : ∀ n → isTrans (Approx n) isTransApprox zero = isTransTot isTransApprox (suc n) = isTransRelator (isTransApprox n) isEquivRelApprox : ∀ n → isEquivRel (Approx n) isEquivRelApprox n = equivRel (isReflApprox n) (isSymApprox n) (isTransApprox n) isReflBisim : isRefl Bisim isReflBisim t = bisim {s = t} {t = t} λ { n → (isReflApprox n (t .elements n)) } isSymBisim : isSym Bisim isSymBisim s t s≈t = bisim λ n → isSymApprox n _ _ (s≈t .elements n) isTransBisim : isTrans Bisim isTransBisim s t u s≈t t≈u = bisim {s = s} {t = u} λ n → isTransApprox n _ _ _ (s≈t .elements n) (t≈u .elements n) isEquivRelBisim : isEquivRel Bisim isEquivRelBisim = equivRel isReflBisim isSymBisim isTransBisim BisimApproxEquiv : ∀ {s t} → Bisim s t ≃ (∀ n → Approx n (cut n s) (cut n t)) BisimApproxEquiv {s} {t} = propBiimpl→Equiv (isPropBisim _ _) (isPropΠ (isPropRelatorLim^ s t)) elements bisim BisimRelation : Relation ℓ-zero ℓ-zero BisimRelation .fst = Tree BisimRelation .snd .RelationStr.rel = Bisim BisimRelation .snd .RelationStr.is-relation .IsRelation.is-set-carrier = isSetTree BisimRelation .snd .RelationStr.is-relation .IsRelation.is-prop-rel = isPropBisim TreeSetoid : Setoid ℓ-zero ℓ-zero TreeSetoid = Setoid.Relation→Setoid BisimRelation isEquivRelBisim