open import Expr
open import Type
-
-data η̂ : Set where
+-- Output
+data η̂ : Set where
+ -- o@l(e) -- Notification
_at_[_] : Operation → Location → Expr → η̂
+
+ -- o@l(e)(x) -- Solicit-response
_at_[_][_] : Operation → Location → Expr → Variable → η̂
data Behaviour : Set
+-- Input
data η : Set where
+ -- o(x) -- One-way
_[_] : Operation → Variable → η
+
+ -- o(x)(x'){B} -- Request-response
_[_][_]_ : Operation → Variable → Variable → Behaviour → η
data Behaviour where
output : η̂ → Behaviour
if_then_else_ : Expr → Behaviour → Behaviour → Behaviour
while[_]_ : Expr → Behaviour → Behaviour
+
+ -- Sequence
_∶_ : Behaviour → Behaviour → Behaviour
- _∣_ : Behaviour → Behaviour → Behaviour
+
+ -- Parallel
+ _∥_ : Behaviour → Behaviour → Behaviour
+
+ -- Assign
_≃_ : Variable → Expr → Behaviour
+
nil : Behaviour
+
+ -- [η₁]{B₁}⋯[ηₐ]{Bₐ} -- Input choice
inputchoice : List (η × Behaviour) → Behaviour
+
wait : Channel → Operation → Location → Variable → Behaviour
exec : Channel → Operation → Variable → Behaviour → Behaviour
open import Variable
-data SideEffect : ∀ {n m} → Ctx n → Ctx m → Set where
- updated : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} → SideEffect Γ Γ₁
- identity : ∀ {n} → (Γ : Ctx n) → SideEffect Γ Γ
- undefined : SideEffect [] []
+data _⊢_↦_⊢_ : ∀ {n m} → Ctx n → Behaviour → Ctx m → Behaviour → Set where
+ upd : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b₁ b₂ : Behaviour} → Γ ⊢ b₁ ↦ Γ₁ ⊢ b₂
+ idn : ∀ {n} {Γ : Ctx n} {b : Behaviour} → Γ ⊢ b ↦ Γ ⊢ b
data _⊢ₑ_∶_ {n : ℕ} (Γ : Ctx n) : Expr → Type → Set where
expr-t : {s : Expr} {b : Type}
------------------
→ ◆ Γ ⊢B nil ▹ ◆ Γ
- t-if : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b1 b2 : Behaviour} {e : Expr}
+ t-if : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b₁ b₂ : Behaviour} {e : Expr}
→ Γ ⊢ₑ e ∶ bool -- Γ ⊢ e : bool
- → ◆ Γ ⊢B b1 ▹ ◆ Γ₁
- → ◆ Γ ⊢B b2 ▹ ◆ Γ₁
+ → ◆ Γ ⊢B b₁ ▹ ◆ Γ₁
+ → ◆ Γ ⊢B b₂ ▹ ◆ Γ₁
--------------------------
- → ◆ Γ ⊢B if e then b1 else b2 ▹ ◆ Γ₁
+ → ◆ Γ ⊢B if e then b₁ else b₂ ▹ ◆ Γ₁
t-while : ∀ {n} {Γ : Ctx n} {b : Behaviour} {e : Expr}
→ Γ ⊢ₑ e ∶ bool
→ ◆ Γ₁ ⊢B b1 ▹ ◆ Γ₁'
→ ◆ Γ₂ ⊢B b2 ▹ ◆ Γ₂'
--------------------------------------
- â\86\92 (â\96 Î\93â\82\81 Î\93â\82\82) â\8a¢B b1 â\88£ b2 ▹ (■ Γ₁' Γ₂')
+ â\86\92 (â\96 Î\93â\82\81 Î\93â\82\82) â\8a¢B b1 â\88¥ b2 ▹ (■ Γ₁' Γ₂')
- t-seq : ∀ {n m k} {Γ : Ctx n} {Γ₁ : Ctx k} {Γ₂ : Ctx m} {b1 b2 : Behaviour}
- → ◆ Γ ⊢B b1 ▹ ◆ Γ₁
- → ◆ Γ₁ ⊢B b2 ▹ ◆ Γ₂
+ t-seq : ∀ {n m k} {Γ : Ctx n} {Γ₁ : Ctx k} {Γ₂ : Ctx m} {b₁ b₂ : Behaviour}
+ → ◆ Γ ⊢B b₁ ▹ ◆ Γ₁
+ → ◆ Γ₁ ⊢B b₂ ▹ ◆ Γ₂
-------------------------
- → ◆ Γ ⊢B b1 ∶ b2 ▹ ◆ Γ₂
+ → ◆ Γ ⊢B b₁ ∶ b₂ ▹ ◆ Γ₂
t-notification : ∀ {n} {Γ : Ctx n} {o : Operation} {l : Location} {e : Variable} {T₀ Tₑ : Type}
→ (outNotify o l T₀) ∈ Γ
----------------------------
→ ◆ Γ ⊢B exec r o x b ▹ ◆ Γ₁
- t-mutate : ∀ {n m k} {Γ : Ctx n} {Γ₁ : Ctx m} {Γₐ : Ctx k} {b : Behaviour}
- → SideEffect Γ Γₐ
- → ◆ Γ ⊢B b ▹ ◆ Γ₁
+ t-mutate : ∀ {n m k} {Γ : Ctx n} {Γ₁ : Ctx m} {Γₐ : Ctx k} {b₁ b₂ : Behaviour}
+ → Γ ⊢ b₁ ↦ Γₐ ⊢ b₂
+ → ◆ Γ ⊢B b₁ ▹ ◆ Γ₁
------------------
- → ◆ Γₐ ⊢B b ▹ ◆ Γ₁
+ → ◆ Γₐ ⊢B b₂ ▹ ◆ Γ₁
-struct-congruence : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b1 b2 : Behaviour} → ◆ Γ ⊢B b1 ▹ ◆ Γ₁ → b1 ≡ b2 → ◆ Γ ⊢B b2 ▹ ◆ Γ₁
+struct-congruence : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b₁ b₂ : Behaviour}
+ → ◆ Γ ⊢B b₁ ▹ ◆ Γ₁
+ → b₁ ≡ b₂
+ → ◆ Γ ⊢B b₂ ▹ ◆ Γ₁
struct-congruence t refl = t
-struct-cong-nil : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b : Behaviour} → ◆ Γ ⊢B (nil ∶ b) ▹ ◆ Γ₁ → ◆ Γ ⊢B b ▹ ◆ Γ₁
-struct-cong-nil (t-seq x x₁) = t-mutate updated x₁
-struct-cong-nil (t-mutate x x₁) = t-mutate updated (struct-cong-nil x₁)
-
-struct-cong-par-nil : ∀ {k k₁ p p₁} {Γ₁ : Ctx k} {Γ₂ : Ctx p} {Γ₁' : Ctx k₁} {Γ₂' : Ctx p₁} {b : Behaviour} → ■ Γ₁ Γ₂ ⊢B (b ∣ nil) ▹ ■ Γ₁' Γ₂' → ◆ Γ₁ ⊢B b ▹ ◆ Γ₁'
+struct-cong-par-nil : ∀ {k k₁ p p₁} {Γ₁ : Ctx k} {Γ₂ : Ctx p} {Γ₁' : Ctx k₁} {Γ₂' : Ctx p₁} {b : Behaviour}
+ → ■ Γ₁ Γ₂ ⊢B (b ∥ nil) ▹ ■ Γ₁' Γ₂'
+ → ◆ Γ₁ ⊢B b ▹ ◆ Γ₁'
struct-cong-par-nil (t-par x _) = x
-struct-cong-par-sym : ∀ {k k₁ p p₁} {Γ₁ : Ctx k} {Γ₂ : Ctx p} {Γ₁' : Ctx k₁} {Γ₂' : Ctx p₁} {b1 b2 : Behaviour} → ■ Γ₁ Γ₂ ⊢B (b1 ∣ b2) ▹ ■ Γ₁' Γ₂' → ■ Γ₂ Γ₁ ⊢B (b2 ∣ b1) ▹ ■ Γ₂' Γ₁'
+struct-cong-par-sym : ∀ {k k₁ p p₁} {Γ₁ : Ctx k} {Γ₂ : Ctx p} {Γ₁' : Ctx k₁} {Γ₂' : Ctx p₁} {b₁ b₂ : Behaviour}
+ → ■ Γ₁ Γ₂ ⊢B (b₁ ∥ b₂) ▹ ■ Γ₁' Γ₂'
+ → ■ Γ₂ Γ₁ ⊢B (b₂ ∥ b₁) ▹ ■ Γ₂' Γ₁'
struct-cong-par-sym (t-par t₁ t₂) = t-par t₂ t₁
-preservation : ∀ {n m k} {Γ : Ctx n} {Γₐ : Ctx k} {Γ₁ : Ctx m} {b : Behaviour} → ◆ Γ ⊢B b ▹ ◆ Γ₁ → SideEffect Γ Γₐ → ◆ Γₐ ⊢B b ▹ ◆ Γ₁
+struct-cong-nil : ∀ {n m} {Γ : Ctx n} {Γ₁ : Ctx m} {b : Behaviour}
+ → ◆ Γ ⊢B (nil ∶ b) ▹ ◆ Γ₁
+ → ◆ Γ ⊢B b ▹ ◆ Γ₁
+struct-cong-nil = t-mutate upd
+
+preservation : ∀ {n m k} {Γ : Ctx n} {Γₐ : Ctx k} {Γ₁ : Ctx m} {b₁ b₂ : Behaviour}
+ → ◆ Γ ⊢B b₁ ▹ ◆ Γ₁
+ → Γ ⊢ b₁ ↦ Γₐ ⊢ b₂
+ → ◆ Γₐ ⊢B b₂ ▹ ◆ Γ₁
preservation x s = t-mutate s x