open import Relation.Binary
open import Relation.Binary.PropositionalEquality hiding (isPreorder) renaming (isEquivalence to isEquivalence≡ ; trans to trans≡)
open import Relation.Binary.Structures
open import Relation.Binary.Core
open import Relation.Binary.Lattice
open import Data.Sum renaming (swap to swap⊎)
open import Data.Product
open import Relation.Nullary
open import Relation.Nullary.Negation
open import Relation.Unary hiding (_⇒_)
open import Agda.Primitive
open import Function using (Fun₂)
open import Function.Base
open import Data.Empty
open import Function.Equality hiding (_∘_ ; const ; flip)
open import Function.Injection hiding (_∘_)
open import Function.Bijection hiding (_∘_)
open import Helper
open import Induction.WellFounded
open import Induction
module CCSL (Instant : StrictPartialOrder _ _ _) where
open import Interval Instant public
open IsPartialOrder using (isPreorder ; antisym)
Clock₀ : Set₁
Clock₀ = ∃ \Ticks → Trichotomous {A = ∃ Ticks} _≡'_ _≺'_
record Clock : Set₁ where
constructor _⌞_ ; field
Ticks : Pred Support _
TTot : Trichotomous {A = ∃ Ticks} _≡'_ _≺'_
open Clock public
1⇒2 : Clock₀ → Clock
1⇒2 (Ticks , TTot) = Ticks ⌞ TTot
2⇒1 : Clock → Clock₀
2⇒1 (Ticks ⌞ TTot) = Ticks , TTot
≈→≡ : ∀ {c} {i j : ∃ (Ticks c)} → i ≈' j → i ≡' j
≈→≡ {c} {i} {j} with TTot c i j
≈→≡ | tri< a _ _ = ⊥-elim ∘ (≺→¬≈ (inj₁ a))
≈→≡ | tri≈ _ b _ = const b
≈→≡ | tri> _ _ c = ⊥-elim ∘ (≺→¬≈ (inj₂ c))
passive : Pred Clock _
passive = Empty ∘ Ticks
active : Pred Clock _
active = ¬_ ∘ passive
_filterBy_ : Clock → (Pred _ _) → Clock
((Ticks ⌞ _) filterBy P) .Ticks = Ticks ∩ P
((_ ⌞ TTot) filterBy _) .TTot (x , y , _) (x₁ , y₁ , _)
= TTot (x , y) (x₁ , y₁)
_filterBy'_ : Clock → (Pred _ _) → Clock
(Ticks ⌞ TTot) filterBy' P
= (Ticks ∩ P) ⌞ λ {(x , y , _) (x₁ , y₁ , _) → TTot (x , y) (x₁ , y₁)}
passiveFilter : ∀ {c P} → passive c → passive (c filterBy P)
passiveFilter p x = p x ∘ proj₁
activeFilter : ∀ {c P} → active (c filterBy P) → active c
activeFilter {c} = _∘ (passiveFilter {c})
_∣ᵢ_ : Clock → Interval → Clock
c ∣ᵢ I = c filterBy (_∈ᵢ I)
_ticksIn_ : Clock → Interval → Set
c ticksIn I = active (c ∣ᵢ I)
_iddlesIn_ : Clock → Interval → Set
c iddlesIn I = passive (c ∣ᵢ I)
presIddles : ∀ {c I₀ I₁} → c iddlesIn I₁ → I₀ ⊂ᵢ I₁ → c iddlesIn I₀
presIddles passcI₁ I₀⊂ᵢI₁ i (ti , i∈I₀) = passcI₁ i (ti , I₀⊂ᵢI₁ i∈I₀)
presTicks : ∀ {c I₀ I₁} → c ticksIn I₀ → I₀ ⊂ᵢ I₁ → c ticksIn I₁
presTicks {c} p I₀⊂ᵢI₁ passcI₁ = p (presIddles {c} passcI₁ I₀⊂ᵢI₁)
_diesIn_ : REL Clock Interval _
c diesIn I = ∃ λ i → i ∈ᵢ I × Ticks c i × (∀ j → Ticks c j → i ≼ j → j ∈ᵢ I)
_diesOn_ : REL Clock Support _
c diesOn i = c diesIn ⟦ i - i ⟧
dies≈ : ∀ {i j c} → c diesOn i → c diesOn j → i ≈ j
dies≈ {c = c} (_ , o∈ii , tco , _) (_ , u∈jj , tcu , _)
with sameB refl≈ o∈ii | sameB refl≈ u∈jj | TTot c (_ , tco) (_ , tcu)
dies≈ _ _ | o≈i | u≈j | tri≈ _ refl _ =
trans≈ (sym≈ o≈i) (trans≈ refl≈ u≈j)
dies≈ (_ , _ , _ , po) (u , _ , tcu , _) | o≈i | _ | tri< o≺u _ _ =
contradiction
(sym≈ (trans≈ (sameB refl≈ (po u tcu (inj₂ o≺u))) (sym≈ o≈i)))
(≺→¬≈ (inj₁ o≺u))
dies≈ (o , _ , tco , _) (_ , _ , _ , pu) | _ | u≈j | tri> _ _ u≺o =
contradiction
(trans≈ (sameB refl≈ (pu o tco (inj₂ u≺o))) (sym≈ u≈j))
(≺→¬≈ (inj₂ u≺o))
staysDead : ∀ {i d c} → c diesOn d → d ≺ i → c iddlesIn ⟦ i -∞⟦
staysDead (_ , d∈xx , _ , p) d≺i j (tcj , i≼j) = proj₂
(p j tcj (trans≼ (≼-resp-≈₂
(sym≈ (sameB refl≈ d∈xx)) (inj₂ d≺i)) i≼j)) (trans≺≼ d≺i i≼j)
CCSLRelation : Set₁
CCSLRelation = Rel Clock _
CCSLRelationᵢ : Set₁
CCSLRelationᵢ = Interval → CCSLRelation
toRelᵢ : CCSLRelation → CCSLRelationᵢ
toRelᵢ _CR_ I = _CR_ on (_filterBy (_∈ᵢ I))
toRelᵢWithP : CCSLRelation → CCSLRelationᵢ → CCSLRelationᵢ
toRelᵢWithP _CR_ CRᵢ I c₁ c₂ = toRelᵢ _CR_ I c₁ c₂ × CRᵢ I c₁ c₂
_⊑_ : CCSLRelation
(Tc₁ ⌞ _) ⊑ (Tc₂ ⌞ _) = ∀ (x₁ : ∃ Tc₁) → ∃ \(x₂ : ∃ Tc₂) → x₁ ≈' x₂
trans⊑ : Transitive _⊑_
trans⊑ c₁⊑c₂ _ x with c₁⊑c₂ x
trans⊑ _ c₂⊑c₃ _ | y , _ with c₂⊑c₃ y
trans⊑ _ _ _ | _ , x≈y | z , y≈z = z , trans≈ x≈y y≈z
refl⊑ : Reflexive _⊑_
refl⊑ = _, refl≈
isPreorder≡⊑ : IsPreorder _≡_ _⊑_
isPreorder≡⊑ = record {
isEquivalence = isEquivalence≡ ;
reflexive = λ { {c} refl → refl⊑ {c}} ;
trans = λ {c₁} {c₂} {c₃} → trans⊑ {c₁} {c₂} {c₃}}
opToRel : ∀ {c P} → (c filterBy P) ⊑ c
opToRel (i , tci , _) = (i , tci) , refl≈
_∽_ : CCSLRelation
c₁ ∽ c₂ = c₁ ⊑ c₂ × c₂ ⊑ c₁
isEq∽ : IsEquivalence _∽_
isEq∽ .IsEquivalence.refl = (_, refl≈) , _, refl≈
isEq∽ .IsEquivalence.sym = swap
isEq∽ .IsEquivalence.trans {i} {j} {k} (i⊑j , j⊑i) (j⊑k , k⊑j) =
trans⊑ {i} {j} {k} i⊑j j⊑k , trans⊑ {k} {j} {i} k⊑j j⊑i
isPartialOrder∽⊑ : IsPartialOrder _∽_ _⊑_
isPartialOrder∽⊑ .isPreorder .IsPreorder.isEquivalence = isEq∽
isPartialOrder∽⊑ .isPreorder .IsPreorder.reflexive = proj₁
isPartialOrder∽⊑ .isPreorder .IsPreorder.trans {c₁} {c₂} {c₃} =
trans⊑ {c₁} {c₂} {c₃}
isPartialOrder∽⊑ .antisym = _,_
relToOp : ∀ {c₀ c₁} → c₀ ⊑ c₁ → ∃ (_∽ c₀ ∘ c₁ filterBy_)
relToOp {c₀} {c₁} c₀⊑c₁ =
(λ i → ∃ \j → Ticks c₀ j × i ≈ j) ,
(λ {(_ , _ , j , tc₀j , i≈j) → (j , tc₀j) , i≈j}) ,
λ {(i , tc₀i) → case c₀⊑c₁ (i , tc₀i) of
λ {((j , tc₁j) , i≈j) → (j , tc₁j , i , tc₀i , sym≈ i≈j) , i≈j}}
_♯_ : CCSLRelation
(Tc₁ ⌞ _) ♯ (Tc₂ ⌞ _) = ∀ (x : ∃ Tc₁) (y : ∃ Tc₂) → ¬ x ≈' y
sym♯ : Symmetric _♯_
sym♯ p x y = (p y x) ∘ sym≈
♯⊑ : ∀ {c₁ c₂ c₃ c₄} → c₂ ♯ c₄ → c₁ ⊑ c₂ → c₃ ⊑ c₄ → c₁ ♯ c₃
♯⊑ c₂♯c₄ c₁⊑c₂ c₃⊑c₄ i j i≈'j with c₁⊑c₂ i | c₃⊑c₄ j
♯⊑ c₂♯c₄ _ _ _ _ i≈j | k , i≈k | l , j≈l =
c₂♯c₄ k l (trans≈ (sym≈ i≈k) (trans≈ i≈j j≈l))
♯×⊑→⊥ : ∀ {c₁ c₂} → c₁ ♯ c₂ → c₁ ⊑ c₂ → passive c₁
♯×⊑→⊥ c₁♯c₂ c₁⊑c₂ i tc₁i with c₁⊑c₂ (i , tc₁i)
♯×⊑→⊥ c₁♯c₂ c₁⊑c₂ i tc₁i | j , i≈j = c₁♯c₂ (i , tc₁i) j i≈j
record Precedence (_<_ : Rel Support _) (c₁ c₂ : Clock) : Set where
field
h : ∃ (Ticks c₂) → ∃ (Ticks c₁)
congruent : ∀ {i j} → i ≈' j → h i ≈' h j
precedes : ∀ i → proj₁ (h i) < proj₁ i
preserves : ∀ {i j} → i ≺' j → h i ≺' h j
dense : ∀ {i j} {p : ∃ (Ticks c₁)} →
h i ≺' p → p ≺' h j → ∃ (_≈' p ∘ h)
preserves← : ∀ {i j} → h i ≺' h j → i ≺' j
preserves← {i} {j} with TTot c₂ i j
preserves← | tri< a _ _ = const a
preserves← | tri≈ _ b _ = ⊥-elim ∘ (irrefl≈≺ ∘ congruent) (≡→≈ b)
preserves← | tri> _ _ c = ⊥-elim ∘ (≼→¬≺ ∘ inj₂ ∘ preserves) c
h′ : (_⟶_ on (toSetoid ∘ Ticks)) c₂ c₁
h′ = record { _⟨$⟩_ = h ; cong = congruent}
injective : Injective h′
injective {i} {j} with TTot c₂ i j
injective | tri< a _ _ = (contradiction a) ∘
(contraposition preserves) ∘ ≼→¬≺ ∘ inj₁ ∘ sym≈
injective | tri≈ _ b _ = const (≡→≈ b)
injective | tri> _ _ c = (contradiction c) ∘
(contraposition preserves) ∘ ≼→¬≺ ∘ inj₁
bijective : Bijective (imageFunction h′)
bijective = injtobij injective
_≺≺_ : CCSLRelation
_≺≺_ = Precedence _≺_
_≼≼_ : CCSLRelation
_≼≼_ = Precedence _≼_
open Precedence public
tprec : ∀ {R} → Transitive R → (Transitive ∘ Precedence) R
tprec _ p₁₂ p₂₃ .h = (h p₁₂) ∘ (h p₂₃)
tprec _ p₁₂ p₂₃ .congruent = (congruent p₁₂) ∘ (congruent p₂₃)
tprec tr p₁₂ p₂₃ .precedes = (tr (precedes p₁₂ _)) ∘ (precedes p₂₃)
tprec _ p₁₂ p₂₃ .preserves = (preserves p₁₂) ∘ (preserves p₂₃)
tprec _ p₁₂ p₂₃ .dense {p = k} ≺k k≺ with dense p₁₂ {p = k} ≺k k≺
tprec _ p₁₂ p₂₃ .dense ≺k k≺ | l , hl≈p with dense p₂₃ {p = l}
(preserves← p₁₂ (≺-resp-≈₁ (sym≈ hl≈p) ≺k))
(preserves← p₁₂ (≺-resp-≈₂ (sym≈ hl≈p) k≺))
tprec _ p₁₂ p₂₃ .dense _ _ | m , hm≈p | n , hn≈p =
n , trans≈ (congruent p₁₂ hn≈p) hm≈p
trans≺≺ : Transitive _≺≺_
trans≺≺ = tprec trans≺
trans≼≼ : Transitive _≼≼_
trans≼≼ = tprec trans≼
≺≺-respʳ-∽ : _≺≺_ Respectsʳ _∽_
≺≺-respˡ-∽ : _≺≺_ Respectsˡ _∽_
≺≺-respʳ-∽ (_ , c₃⊑c₂) c₁≺≺c₂ .h = (h c₁≺≺c₂) ∘ proj₁ ∘ c₃⊑c₂
≺≺-respʳ-∽ {_} {c₂} (_ , c₃⊑c₂) c₁≺≺c₂ .congruent =
(congruent c₁≺≺c₂) ∘
(trans≈ ((sym≈ ∘ proj₂ ∘ c₃⊑c₂) _)) ∘
(flip trans≈ ((proj₂ ∘ c₃⊑c₂) _))
≺≺-respʳ-∽ (_ , c₃⊑c₂) c₁≺≺c₂ .precedes =
(flip ≺-resp-≈₁ (precedes c₁≺≺c₂ _)) ∘ sym≈ ∘ proj₂ ∘ c₃⊑c₂
≺≺-respʳ-∽ (_ , c₃⊑c₂) c₁≺≺c₂ .preserves =
(preserves c₁≺≺c₂) ∘
(≺-resp-≈₂ ((proj₂ ∘ c₃⊑c₂) _)) ∘
(≺-resp-≈₁ ((proj₂ ∘ c₃⊑c₂) _))
≺≺-respʳ-∽ {_} {c₂} (c₂⊑c₃ , c₃⊑c₂) c₁≺≺c₂ .dense {p = p} u v =
((proj₁ ∘ c₂⊑c₃ ∘ proj₁ ∘ (dense c₁≺≺c₂ {p = p} u)) v) ,
trans≈ (congruent c₁≺≺c₂ ((sym≈ (trans≈ ((proj₂ ∘ c₂⊑c₃) _)
((proj₂ ∘ c₃⊑c₂ ∘ proj₁ ∘ c₂⊑c₃) _)))))
(proj₂ (dense c₁≺≺c₂ u v))
≺≺-respˡ-∽ (c₂⊑c₃ , _) c₂≺≺c₁ .h =
proj₁ ∘ c₂⊑c₃ ∘ h c₂≺≺c₁
≺≺-respˡ-∽ {_} {_} {c₃} (c₂⊑c₃ , _) c₂≺≺c₁ .congruent =
(flip trans≈ ((proj₂ ∘ c₂⊑c₃) _)) ∘
(trans≈ ((sym≈ ∘ proj₂ ∘ c₂⊑c₃) _)) ∘
(congruent c₂≺≺c₁)
≺≺-respˡ-∽ (c₂⊑c₃ , _) c₂≺≺c₁ .precedes =
(≺-resp-≈₂ ((proj₂ ∘ c₂⊑c₃) _)) ∘
(precedes c₂≺≺c₁)
≺≺-respˡ-∽ (c₂⊑c₃ , _) c₂≺≺c₁ .preserves =
≺-resp-≈₁ ((proj₂ ∘ c₂⊑c₃) _) ∘
≺-resp-≈₂ ((proj₂ ∘ c₂⊑c₃) _) ∘
preserves c₂≺≺c₁
≺≺-respˡ-∽ {c₁} {c₂} {c₃} (c₂⊑c₃ , c₃⊑c₂) c₂≺≺c₁ .dense {p = p} u v
with c₃⊑c₂ p
≺≺-respˡ-∽ {c₁} {c₂} {c₃} (c₂⊑c₃ , c₃⊑c₂) c₂≺≺c₁ .dense {p = p} u v |
q , p≈q with dense c₂≺≺c₁ {p = q} (≺-resp-≈₁ p≈q (≺-resp-≈₂
((sym≈ ∘ proj₂ ∘ c₂⊑c₃ ∘ h c₂≺≺c₁) _) u))
(≺-resp-≈₁ ((sym≈ ∘ proj₂ ∘ c₂⊑c₃ ∘ h c₂≺≺c₁) _)
(≺-resp-≈₂ p≈q v))
≺≺-respˡ-∽ {c₁} {c₂} {c₃} (c₂⊑c₃ , c₃⊑c₂) c₂≺≺c₁ .dense {p = p} _ _
| q , p≈q | r , hr≈q = r ,
(trans≈ ((sym≈ ∘ proj₂ ∘ c₂⊑c₃ ∘ h c₂≺≺c₁) r)
(trans≈ hr≈q (sym≈ p≈q)))
c≺≺∅ : ∀ {c e} → passive e → c ≺≺ e
c≺≺∅ p = record
{ h = λ {(i , ti) → ⊥-elim (p i ti)}
; congruent = λ { {i , ti} _ → ⊥-elim (p i ti)}
; precedes = λ {(i , ti) → ⊥-elim (p i ti)}
; preserves = λ { {i , ti} _ → ⊥-elim (p i ti)}
; dense = λ { {i , ti} _ → ⊥-elim (p i ti)}}
∅≺≺∅ : ∀ {e} → passive e → e ≺≺ e
∅≺≺∅ = c≺≺∅
record InitialClock : Set₁ where
field
clock : Clock
first : ∃ λ (x : ∃ (Ticks clock)) → ∀ (y : ∃ (Ticks clock)) → x ≼' y
open InitialClock
_∽ᵢ_ : Rel InitialClock _
_∽ᵢ_ = _∽_ on clock
_≺≺ᵢ_ : Rel InitialClock _
_≺≺ᵢ_ = _≺≺_ on clock
≺≺-irrefl : Irreflexive _∽ᵢ_ _≺≺ᵢ_
≺≺-irrefl {y = c₂} _ _ with first c₂
≺≺-irrefl c₁∽c₂ c₁≺≺c₂ | f , f≼x with proj₁ c₁∽c₂ (h c₁≺≺c₂ f)
≺≺-irrefl _ c₁≺≺c₂ | f , f≼x | g , hf≈g =
irrefl≈≺ hf≈g (trans≺≼ (precedes c₁≺≺c₂ f) (f≼x g))
open IsStrictPartialOrder
≺≺-ispo : IsStrictPartialOrder _∽ᵢ_ _≺≺ᵢ_
≺≺-ispo .isEquivalence =
record { refl = (_, refl≈) , _, refl≈ ; sym = swap ;
trans = λ { {record {clock = i}}
{record {clock = j}} {record {clock = k}}
(i⊑j , j⊑i) (j⊑k , k⊑j) → trans⊑ {i} {j} {k} i⊑j j⊑k
, trans⊑ {k} {j} {i} k⊑j j⊑i} }
≺≺-ispo .irrefl {i} {j} = ≺≺-irrefl {i} {j}
≺≺-ispo .trans = trans≺≺
≺≺-ispo .<-resp-≈ = ≺≺-respʳ-∽ , ≺≺-respˡ-∽
refl≼≼ : _∽_ ⇒ _≼≼_
refl≼≼ {c₁} (c₁⊑c₂ , c₂⊑c₁) = record {
h = proj₁ ∘ c₂⊑c₁ ;
congruent =
flip trans≈ (proj₂ (c₂⊑c₁ _)) ∘
(trans≈ ((sym≈ ∘ proj₂ ∘ c₂⊑c₁) _)) ;
precedes = inj₁ ∘ sym≈ ∘ proj₂ ∘ c₂⊑c₁ ;
preserves = ≺-resp-≈₂ ((proj₂ ∘ c₂⊑c₁) _) ∘
(≺-resp-≈₁ ((proj₂ ∘ c₂⊑c₁) _)) ;
dense = λ {_} {_} {p} _ _ → proj₁ (c₁⊑c₂ p) ,
(trans≈ (sym≈
((proj₂ ∘ c₂⊑c₁ ∘ proj₁ ∘ c₁⊑c₂) p))
((sym≈ ∘ proj₂ ∘ c₁⊑c₂) p))}
isPreorder≡≼≼ : IsPreorder _∽_ _≼≼_
isPreorder≡≼≼ = record {
isEquivalence = isEq∽ ; reflexive = refl≼≼ ; trans = trans≼≼ }
record WFClock : Set₁ where
field clock : Clock ; wf-≺ : WellFounded (_≺'_ {P = Ticks clock})
open WFClock
_∽ₒ_ : Rel WFClock _
_∽ₒ_ = _∽_ on clock
_≼≼ₒ_ : Rel WFClock _
_≼≼ₒ_ = _≼≼_ on clock
i≈hi : ∀ {c₁ c₂} (₁≼₂ : c₁ ≼≼ₒ c₂) (₂≼₁ : c₂ ≼≼ₒ c₁) i →
i ≈' ((h ₁≼₂) ∘ (h ₂≼₁)) i → i ≈' h ₂≼₁ i
i≈hi ₁≼₂ ₂≼₁ i p with precedes ₂≼₁ i
i≈hi ₁≼₂ ₂≼₁ i p | inj₁ x = sym≈ x
i≈hi {c₁} {c₂} ₁≼₂ ₂≼₁ i p | inj₂ y =
⊥-elim ((≺→¬≈ (inj₂ (trans≼≺ (precedes ₁≼₂ (h ₂≼₁ i)) y))) p)
auxi≈h₁hi : ∀ {c₁ c₂} (₁≼₂ : c₁ ≼≼ₒ c₂) (₂≼₁ : c₂ ≼≼ₒ c₁) i →
({x : ∃ (Ticks (clock c₁))} → x ≺' i → x ≈' (h ₁≼₂ (h ₂≼₁ x))) →
(h ₁≼₂ (h ₂≼₁ i)) ≺' i → i ≈' (h ₁≼₂ (h ₂≼₁ i))
auxi≈h₁hi {c₁} {c₂} ₁≼₂ ₂≼₁ i p h₁hi≺i = let h , h₁ = h ₂≼₁ , h ₁≼₂ in
let h₁hi≈h₁hh₁hi = p {(h₁ ∘ h) i} h₁hi≺i in
let h₁hi≈hh₁hi = i≈hi {c₁} {c₂} ₁≼₂ ₂≼₁ ((h₁ ∘ h) i) h₁hi≈h₁hh₁hi in
let hh₁hi≺hi = preserves ₂≼₁ {(h₁ ∘ h) i} {i} h₁hi≺i in
let h₁hh₁hi≺h₁hi = preserves ₁≼₂ {(h ∘ h₁ ∘ h) i} {h i} hh₁hi≺hi in
⊥-elim (≼→¬≺ (inj₁ h₁hi≈h₁hh₁hi) h₁hh₁hi≺h₁hi)
step : ∀ {c₁ c₂} (₁≼₂ : c₁ ≼≼ₒ c₂) (₂≼₁ : c₂ ≼≼ₒ c₁) i → (∀ {x} →
x ≺' i → x ≈' ((h ₁≼₂) ∘ (h ₂≼₁)) x) → i ≈' ((h ₁≼₂) ∘ (h ₂≼₁)) i
step ₁≼₂ ₂≼₁ i p with precedes ₂≼₁ i | precedes ₁≼₂ (h ₂≼₁ i)
step ₁≼₂ ₂≼₁ i p | inj₁ x | inj₁ y = sym≈ (trans≈ y x)
step {c₁} {c₂} ₁≼₂ ₂≼₁ i p | inj₁ hi≈i | inj₂ h₁hi≺hi =
auxi≈h₁hi {c₁} {c₂} ₁≼₂ ₂≼₁ i p (trans≺≼ h₁hi≺hi (inj₁ hi≈i))
step {c₁} {c₂} ₁≼₂ ₂≼₁ i p | inj₂ hi≺i | inj₁ h₁hi≈hi =
auxi≈h₁hi {c₁} {c₂} ₁≼₂ ₂≼₁ i p (trans≼≺ (inj₁ h₁hi≈hi) hi≺i)
step {c₁} {c₂} ₁≼₂ ₂≼₁ i p | inj₂ hi≺i | inj₂ h₁hi≺hi =
auxi≈h₁hi {c₁} {c₂} ₁≼₂ ₂≼₁ i p (trans≺ h₁hi≺hi hi≺i)
i≈h₁∘hi : ∀ {c₁ c₂} (₁≼₂ : c₁ ≼≼ₒ c₂) (₂≼₁ : c₂ ≼≼ₒ c₁) i →
i ≈' ((h ₁≼₂) ∘ (h ₂≼₁)) i
i≈h₁∘hi {c₁} {c₂} ₁≼₂ ₂≼₁ i = let open All (wf-≺ c₁) in
wfRec _ (λ j → j ≈' ((h ₁≼₂) ∘ (h ₂≼₁)) j)
(λ i ri → step {c₁} {c₂} ₁≼₂ ₂≼₁ i (ri _)) i
≼≼-antisym-∽ : Antisymmetric _∽ₒ_ _≼≼ₒ_
≼≼-antisym-∽ {c₁} {c₂} ₁≼₂ ₂≼₁ =
(λ i → h ₂≼₁ i , i≈hi {c₁} {c₂} ₁≼₂ ₂≼₁ i (i≈h₁∘hi {c₁} {c₂} ₁≼₂ ₂≼₁ i)) ,
λ i → h ₁≼₂ i , i≈hi {c₂} {c₁} ₂≼₁ ₁≼₂ i (i≈h₁∘hi {c₂} {c₁} ₂≼₁ ₁≼₂ i)
≼≼-ipo : IsPartialOrder _∽ₒ_ _≼≼ₒ_
≼≼-ipo = record {
isPreorder = record {
isEquivalence = record {
refl = (_, refl≈) , _, refl≈ ;
sym = swap ;
trans = λ { {record {clock = i}} {record {clock = j}}
{record {clock = k}} (i⊑j , j⊑i) (j⊑k , k⊑j) →
trans⊑ {i} {j} {k} i⊑j j⊑k , trans⊑ {k} {j} {i} k⊑j j⊑i} } ;
reflexive = refl≼≼ ;
trans = trans≼≼ } ;
antisym = λ {i} {j} → ≼≼-antisym-∽ {i} {j} }
record _≪≫_ (c₁ c₂ : Clock) : Set where
field
precedence : c₁ ≺≺ c₂
alternate : ∀ {i j : ∃ (Ticks c₂)} → i ≺' j → i ≺' h precedence j
CCSLExpression : ∀ {a} → Set _
CCSLExpression {a} = Clock → Clock → Clock → Set a
_≋_⋂_ : CCSLExpression
(Tc ⌞ _) ≋ Tc₁ ⌞ _ ⋂ (Tc₂ ⌞ _) =
(∀ (x : ∃ Tc) → ∃ λ (y : ∃ Tc₁) → ∃ λ (z : ∃ Tc₂) → x ≈' y × x ≈' z) ×
(∀ (y : ∃ Tc₁) (z : ∃ Tc₂) → y ≈' z → ∃ λ (x : ∃ Tc) → x ≈' y)
passc≋c₁♯c₂ : ∀ {c c₁ c₂} → c ≋ c₁ ⋂ c₂ → c₁ ♯ c₂ → passive c
passc≋c₁♯c₂ (c→c₁c₂ , _) c₁♯c₂ i tci =
let (y , z , x≈y , x≈z) = c→c₁c₂ (i , tci) in
c₁♯c₂ y z (trans≈ (sym≈ x≈y) x≈z)
symInter : ∀ {c} → Symmetric (c ≋_⋂_)
symInter (c→c₁c₂ , c₁c₂→c) =
(λ x → case c→c₁c₂ x of λ {(y , z , x≈y , y≈z) → z , y , y≈z , x≈y}) ,
(λ y z x → case (c₁c₂→c z y) (sym≈ x) of
λ {(t , t≈z) → t , trans≈ t≈z (sym≈ x)})
subInterₗ : ∀ {c c₁ c₂} → c ≋ c₁ ⋂ c₂ → c ⊑ c₁
subInterₗ (c→c₁c₂ , _) x with c→c₁c₂ x
subInterₗ (_ , _) _ | y , _ , x≈y , _ = y , x≈y
subInterᵣ : ∀ {c c₁ c₂} → c ≋ c₁ ⋂ c₂ → c ⊑ c₂
subInterᵣ {c} {c₁} {c₂} =
subInterₗ {c} {c₂} {c₁} ∘ symInter {c} {c₁} {c₂}
≋⋂→⊑ : ∀ {c₀ c c₁ c₂} → c₀ ≋ c₁ ⋂ c₂ → c ≋ c₁ ⋂ c₂ → c ⊑ c₀
≋⋂→⊑ (_ , c₁c₂→c₀) (c→c₁c₂ , _) x =
let y , z , x≈y , x≈z = c→c₁c₂ x in
let t , t≈y = c₁c₂→c₀ y z (trans≈ (sym≈ x≈y) x≈z) in
t , trans≈ x≈y (sym≈ t≈y)
unicityInter : ∀ {c₀ c c₁ c₂} → c₀ ≋ c₁ ⋂ c₂ → c ≋ c₁ ⋂ c₂ → c ∽ c₀
unicityInter {c₀} {c} {c₁} {c₂} p q =
≋⋂→⊑ {c₀} {c} {c₁} {c₂} p q , ≋⋂→⊑ {c} {c₀} {c₁} {c₂} q p
⊑→≋⋂ : ∀ {c₁ c₂} → c₁ ⊑ c₂ → c₁ ≋ c₁ ⋂ c₂
⊑→≋⋂ c₁⊑c₂ =
(λ x → x , let (y , x≈y) = c₁⊑c₂ x in y , refl≈ , x≈y) , λ x _ _ → x , refl≈
⊑⊑→⊑⋂ : ∀ {c₀ c c₁ c₂} → c₀ ⊑ c₁ → c₀ ⊑ c₂ → c ≋ c₁ ⋂ c₂ → c₀ ⊑ c
⊑⊑→⊑⋂ c₀⊑c₁ c₀⊑c₂ (_ , c₁c₂→c) x₀ =
let (x₁ , x₀≈x₁) = c₀⊑c₁ x₀ in
let (x₂ , x₀≈x₂) = c₀⊑c₂ x₀ in
let (x , p) = c₁c₂→c x₁ x₂ (trans≈ (sym≈ x₀≈x₁) x₀≈x₂) in
x , trans≈ x₀≈x₁ (sym≈ p)
_≋_⋃_ : CCSLExpression
(Tc ⌞ _) ≋ (Tc₁ ⌞ _) ⋃ (Tc₂ ⌞ _) =
(∀ (y : ∃ Tc) → ∃ λ (x : ∃ (Tc₁ ∪ Tc₂)) → x ≈' y) ×
(∀ (x : ∃ (Tc₁ ∪ Tc₂)) → ∃ λ (y : ∃ Tc) → x ≈' y)
symUnion : ∀ {c} → Symmetric (c ≋_⋃_)
symUnion (c→c₁c₂ , c₁c₂→c) =
(λ x → let ((y , ty) , p) = c→c₁c₂ x
in (y , swap⊎ ty) , p) ,
λ {(x , tx) → c₁c₂→c (x , swap⊎ tx)}
subUnionₗ : ∀ {c c₁ c₂} → c ≋ c₁ ⋃ c₂ → c₁ ⊑ c
subUnionₗ (_ , c₁c₂→c) (x , Tc₁x) = c₁c₂→c (x , inj₁ Tc₁x)
subUnionᵣ : ∀ {c c₁ c₂} → c ≋ c₁ ⋃ c₂ → c₂ ⊑ c
subUnionᵣ {c} {c₁} {c₂} =
subUnionₗ {c} {c₂} {c₁} ∘ symUnion {c} {c₁} {c₂}
≋⋃→⊑ : ∀ {c₀ c c₁ c₂} → c₀ ≋ c₁ ⋃ c₂ → c ≋ c₁ ⋃ c₂ → c ⊑ c₀
≋⋃→⊑ (_ , c₁c₂→c₀) (c→c₁c₂ , _) x = let (y , x≈y) = c→c₁c₂ x in
let z , y≈z = c₁c₂→c₀ y in z , trans≈ (sym≈ x≈y) y≈z
unicityUnion : ∀ {c₀ c c₁ c₂} → c₀ ≋ c₁ ⋃ c₂ → c ≋ c₁ ⋃ c₂ → c ∽ c₀
unicityUnion {c₀} {c} {c₁} {c₂} p q =
≋⋃→⊑ {c₀} {c} {c₁} {c₂} p q , ≋⋃→⊑ {c} {c₀} {c₁} {c₂} q p
⊑→≋⋃ : ∀ {c₁ c₂} → c₁ ⊑ c₂ → c₂ ≋ c₁ ⋃ c₂
⊑→≋⋃ c₁⊑c₂ =
(λ {(x , tc₁x) → (x , inj₂ tc₁x) , refl≈}) ,
λ {(x , inj₁ tcx) → c₁⊑c₂ (x , tcx) ; (x , inj₂ tc₁x) → (x , tc₁x) , refl≈}
⊑⊑→⊑⋃ : ∀ {c₀ c c₁ c₂} → c₁ ⊑ c₀ → c₂ ⊑ c₀ → c ≋ c₁ ⋃ c₂ → c ⊑ c₀
⊑⊑→⊑⋃ c₁⊑c₀ c₂⊑c₀ (c→c₁c₂ , _) x with c→c₁c₂ x
⊑⊑→⊑⋃ c₁⊑c₀ c₂⊑c₀ (c→c₁c₂ , _) x | (x₁ , inj₁ tx₁) , x₁≈x =
let (x₀ , x₁≈x₀) = c₁⊑c₀ (x₁ , tx₁) in x₀ , trans≈ (sym≈ x₁≈x) x₁≈x₀
⊑⊑→⊑⋃ c₁⊑c₀ c₂⊑c₀ (c→c₁c₂ , _) x | (x₂ , inj₂ tx₂) , x₂≈x =
let (x₀ , x₂≈x₀) = c₂⊑c₀ (x₂ , tx₂) in x₀ , trans≈ (sym≈ x₂≈x) x₂≈x₀
record SpecLattice⋃⋂ (_∧_ _∨_ : Clock → Clock → Clock) : Set₁ where
field
inter∧ : ∀ {c₁ c₂} → (c₁ ∧ c₂) ≋ c₁ ⋂ c₂
union∨ : ∀ {c₁ c₂} → (c₁ ∨ c₂) ≋ c₂ ⋃ c₁
specToLattice⋃⋂ : ∀ {_∧_ _∨_}
→ SpecLattice⋃⋂ _∧_ _∨_ → IsLattice _∽_ _⊑_ _∨_ _∧_
specToLattice⋃⋂ {_∧_} {_∨_}
record { inter∧ = inter∧ ; union∨ = union∨ } =
record {
isPartialOrder = isPartialOrder∽⊑ ;
supremum = λ c₁ c₂ →
subUnionᵣ {c₁ ∨ c₂} {c₂} {c₁} union∨ ,
subUnionₗ {c₁ ∨ c₂} {c₂} {c₁} union∨ ,
λ c₀ c₁⊑c₀ c₂⊑c₀ →
⊑⊑→⊑⋃ {c₀} {c₁ ∨ c₂} {c₂} {c₁} c₂⊑c₀ c₁⊑c₀ union∨ ;
infimum = λ c₁ c₂ →
subInterₗ {c₁ ∧ c₂} {c₁} {c₂} inter∧ ,
subInterᵣ {c₁ ∧ c₂} {c₁} {c₂} inter∧ ,
λ c₀ c₀⊑c₁ c₀⊑c₂ →
⊑⊑→⊑⋂ {c₀} {c₁ ∧ c₂} {c₁} {c₂} c₀⊑c₁ c₀⊑c₂ inter∧ }
_≋_⋁_ : CCSLExpression
c ≋ c₁ ⋁ c₂ = c₁ ≼≼ c × c₂ ≼≼ c ×
∀ {c₀} → c₁ ≼≼ c₀ → c₂ ≼≼ c₀ → c ≼≼ c₀
_≋_⋀_ : CCSLExpression
c ≋ c₁ ⋀ c₂ = c ≼≼ c₁ × c ≼≼ c₂ ×
∀ {c₀} → c₀ ≼≼ c₁ → c₀ ≼≼ c₂ → c₀ ≼≼ c
record SpecLattice⋁⋀ (_∧_ _∨_ : Fun₂ WFClock) : Set₁ where
field
inter∧ : ∀ {c₁ c₂} → clock (c₁ ∧ c₂) ≋ clock c₁ ⋀ clock c₂
union∨ : ∀ {c₁ c₂} → clock (c₁ ∨ c₂) ≋ clock c₂ ⋁ clock c₁
specToLattice⋁⋀ : ∀ {_∧_ _∨_}
→ SpecLattice⋁⋀ _∧_ _∨_ → IsLattice _∽ₒ_ _≼≼ₒ_ _∨_ _∧_
specToLattice⋁⋀ {_∧_} {_∨_}
record { inter∧ = inter∧ ; union∨ = union∨ } =
record { isPartialOrder = ≼≼-ipo ;
supremum = λ _ _ → (proj₁ ∘ proj₂) union∨ , proj₁ union∨ ,
λ _ → flip ((proj₂ ∘ proj₂) union∨) ;
infimum = λ _ _ → proj₁ inter∧ , (proj₁ ∘ proj₂) inter∧ ,
λ _ → (proj₂ ∘ proj₂) inter∧}