import lps.IMLL as IMLL import lps.Linearity as Linearity import lps.Linearity.Action as Action import lps.Linearity.Consumption as Consumption import lps.Search.BelongsTo as BelongsTo import lib.Context as Con module BT = Con.BelongsTo module BTT = BT.BelongsTo open import lib.Maybe open import lib.Nullary open import Data.Empty open import Data.Product hiding (map) open import Data.Nat as ℕ open import Function open import Relation.Nullary open import Relation.Binary.PropositionalEquality as Eq using (_≡_) module lps.Search.Calculus (Pr : Set) (_≟_ : (x y : Pr) → Dec (x ≡ y)) where module Calculus where open Con open Context open IMLL.Type Pr open Linearity.Context Pr open Action.Context Pr module BTC = BelongsTo.Context Pr _≟_ infix 1 _⊢_⊣_ data _⊢_⊣_ {γ : Con ty} (Γ : Usage γ) : (σ : ty) (Δ : Usage γ) → Set where `κ : ∀ {Γ′ k} (pr : Γ BTC.∋ k ∈ Γ′) → Γ ⊢ `κ k ⊣ Γ′ _`⊗ʳ_ : ∀ {σ τ Δ E} (s : Γ ⊢ σ ⊣ Δ) (t : Δ ⊢ τ ⊣ E) → Γ ⊢ σ `⊗ τ ⊣ E _`&ʳ_by_ : ∀ {σ τ Δ₁ Δ₂ E} (s : Γ ⊢ σ ⊣ Δ₁) (t : Γ ⊢ τ ⊣ Δ₂) (pr : E ≡ Δ₁ ⊙ Δ₂) → Γ ⊢ σ `& τ ⊣ E open Context.Context ⊢κ : {γ : Con ty} (k : Pr) {Γ : Usage γ} (pr : Σ[ Γ′ ∈ Usage γ ] Γ BTC.∋ k ∈ Γ′) → Σ[ Γ′ ∈ Usage γ ] Γ ⊢ `κ k ⊣ Γ′ ⊢κ k (Δ , pr) = Δ , `κ pr _⊢⊣?_ : ∀ {γ : Con ty} (Γ : Usage γ) (σ : ty) → Con (Σ[ Γ′ ∈ Usage γ ] Γ ⊢ σ ⊣ Γ′) Γ ⊢⊣? `κ k = map (⊢κ k) $ k BTC.∈? Γ Γ ⊢⊣? σ `⊗ τ = Γ ⊢⊣? σ >>= uncurry $ λ Δ prσ → Δ ⊢⊣? τ >>= uncurry $ λ E prτ → return $ E , prσ `⊗ʳ prτ Γ ⊢⊣? σ `& τ = Γ ⊢⊣? σ >>= uncurry $ λ Δ₁ prσ → Γ ⊢⊣? τ >>= uncurry $ λ Δ₂ prτ → maybe (uncurry $ λ Δ pr → return $ Δ , prσ `&ʳ prτ by pr) ε (Δ₁ ⊙? Δ₂) ⊢⊣?-complete : ∀ {γ : Con ty} {Γ : Usage γ} (σ : ty) {Δ : Usage γ} (pr : Γ ⊢ σ ⊣ Δ) → Σ[ pr ∈ Γ ⊢ σ ⊣ Δ ] (Δ , pr) BT.∈ Γ ⊢⊣? σ ⊢⊣?-complete (`κ k) (`κ pr) = `κ pr , BTT.map (⊢κ k) (BTC.∈?-complete k _ pr) ⊢⊣?-complete (σ `⊗ τ) (pr₁ `⊗ʳ pr₂) with ⊢⊣?-complete σ pr₁ | ⊢⊣?-complete τ pr₂ ... | tm₁ , bt₁ | tm₂ , bt₂ = tm₁ `⊗ʳ tm₂ , BTT.subst bt₁ (BTT.subst bt₂ BT.zro) ⊢⊣?-complete (σ `& τ) (_`&ʳ_by_ {Δ₁ = Δ₁} {Δ₂ = Δ₂} {E = Δ} pr₁ pr₂ mg) with ⊢⊣?-complete σ pr₁ | ⊢⊣?-complete τ pr₂ | ⊙?-complete _ _ mg ... | tm₁ , bt₁ | tm₂ , bt₂ | C , eq = tm₁ `&ʳ tm₂ by C , BTT.subst bt₁ (BTT.subst bt₂ (Eq.subst (λ tm → (Δ , tm₁ `&ʳ tm₂ by C) BT.∈ maybe (uncurry $ λ Δ pr → return $ Δ , tm₁ `&ʳ tm₂ by pr) ε tm) (Eq.sym eq) BT.zro)) _⊢?_ : ∀ {γ : Con ty} (Γ : Usage γ) (σ : ty) → Con (Σ[ Γ′ ∈ Usage γ ] isUsed Γ′ × (Γ ⊢ σ ⊣ Γ′)) Γ ⊢? σ = Γ ⊢⊣? σ >>= uncurry $ λ Γ′ tm → dec (isUsed? Γ′) (λ U → return $ Γ′ , U , tm) (const ε) ⊢?-complete : ∀ {γ : Con ty} {Γ : Usage γ} {σ : ty} {Δ : Usage γ} (prΔ : isUsed Δ) (pr : Γ ⊢ σ ⊣ Δ) → Σ[ pr ∈ Γ ⊢ σ ⊣ Δ ] Σ[ prΔ ∈ isUsed Δ ] (Δ , prΔ , pr) BT.∈ Γ ⊢? σ ⊢?-complete {Γ = Γ} {σ = σ} {Δ} prΔ pr with Γ ⊢⊣? σ | ⊢⊣?-complete σ pr | isUsed? Δ | Eq.inspect isUsed? Δ ... | ts | (tm′ , bt) | yes U | Eq.[ eq ] = tm′ , U , let P = λ d → (Δ , U , tm′) BT.∈ dec d (λ U → return $ Δ , U , tm′) (const ε) in BTT.subst bt (Eq.subst P (Eq.sym eq) BT.zro) ... | ts | (tm′ , bt) | no ¬U | eq = ⊥-elim $ ¬U prΔ ⊢⊣-dec : ∀ {γ : Con ty} (Γ : Usage γ) (σ : ty) → Dec (Σ[ Δ ∈ Usage γ ] isUsed Δ × (Γ ⊢ σ ⊣ Δ)) ⊢⊣-dec Γ σ with Γ ⊢? σ | ⊢?-complete {Γ = Γ} {σ = σ} ... | ε | cmplt = no (BTT.∈ε-elim ∘ proj₂ ∘ proj₂ ∘ uncurry cmplt ∘ proj₂) ... | _ ∙ pr | cmplt = yes pr module Soundness where module Type where open Con open Context open IMLL Pr open IMLL.Type Pr open Context.Context module Cover where open Linearity.Type Pr open Linearity.Type.Cover Pr open Consumption Pr open Consumption.Type.Cover Pr open Action.Type.Cover Pr open Con.BelongsTo open BelongsTo.BelongsTo open IMLL.RewriteRules Pr mutual ¬⊙diffˡ : {a : ty} {S S₁ S₂ A : Cover a} → A ≡ S₁ ⊙ S → S ≡ S₁ ─ S₂ → ⊥ ¬⊙diffˡ (sym prA) prS = ¬⊙diffʳ prA prS ¬⊙diffˡ (`κ k) () ¬⊙diffˡ (prA `⊗ prB) (prS `⊗ prT) = ¬⊙diffˡ prA prS ¬⊙diffˡ (prA `⊗ prB) (prS `⊗ˡ _) = ¬⊙diffˡ prA prS ¬⊙diffˡ (prA `⊗ prB) (_ `⊗ʳ prT) = ¬⊙diffˡ prB prT ¬⊙diffˡ ([ prA ]`⊗ b) (prS `⊗[ .b ]) = ¬⊙diffˡ prA prS ¬⊙diffˡ (a `⊗[ prA ]) ([ .a ]`⊗ prS) = ¬⊙diffˡ prA prS ¬⊙diffˡ (a `& b) () ¬⊙diffˡ ] prA [`&] prB [ () ¬⊙diffˡ ] prB [`& () ¬⊙diffˡ `&] prA [ () ¬⊙diffˡ (prA `&[ b ]) (prS `&[ .b ]) = ¬⊙diffˡ prA prS ¬⊙diffˡ ([ a ]`& prA) ([ .a ]`& prS) = ¬⊙diffˡ prA prS ¬⊙diffʳ : {a : ty} {S S₁ S₂ A : Cover a} → A ≡ S ⊙ S₁ → S ≡ S₁ ─ S₂ → ⊥ ¬⊙diffʳ (sym prA) prS = ¬⊙diffˡ prA prS ¬⊙diffʳ (`κ k) () ¬⊙diffʳ (prA `⊗ prB) (prS `⊗ prT) = ¬⊙diffʳ prA prS ¬⊙diffʳ (prA `⊗ prB) (prS `⊗ˡ _) = ¬⊙diffʳ prA prS ¬⊙diffʳ (prA `⊗ prB) (_ `⊗ʳ prS) = ¬⊙diffʳ prB prS ¬⊙diffʳ ([ prA ]`⊗ b) (prS `⊗[ .b ]) = ¬⊙diffʳ prA prS ¬⊙diffʳ (a `⊗[ prB ]) ([ .a ]`⊗ prT) = ¬⊙diffʳ prB prT ¬⊙diffʳ (a `& b) () ¬⊙diffʳ ] prA [`&] prB [ () ¬⊙diffʳ ] prB [`& () ¬⊙diffʳ `&] prA [ () ¬⊙diffʳ (prA `&[ b ]) (prS `&[ .b ]) = ¬⊙diffʳ prA prS ¬⊙diffʳ ([ a ]`& prB) ([ .a ]`& prT) = ¬⊙diffʳ prB prT ⟦A⊙A⟧ : {a : ty} {A A₁ : Cover a} (s : A ≡ A₁ ⊙ A₁) → A ≡ A₁ ⟦A⊙A⟧ (sym s) = ⟦A⊙A⟧ s ⟦A⊙A⟧ (`κ k) = Eq.refl ⟦A⊙A⟧ (s₁ `⊗ s₂) rewrite ⟦A⊙A⟧ s₁ | ⟦A⊙A⟧ s₂ = Eq.refl ⟦A⊙A⟧ ([ s ]`⊗ b) rewrite ⟦A⊙A⟧ s = Eq.refl ⟦A⊙A⟧ (a `⊗[ s ]) rewrite ⟦A⊙A⟧ s = Eq.refl ⟦A⊙A⟧ (a `& b) = Eq.refl ⟦A⊙A⟧ (s `&[ b ]) rewrite ⟦A⊙A⟧ s = Eq.refl ⟦A⊙A⟧ ([ a ]`& s) rewrite ⟦A⊙A⟧ s = Eq.refl ⟦⊙⟧⊢ : (Γ₁ Γ₂ Δ : Con ty) {a σ τ : ty} → (E₁ : Cover a) (tm₁ : Γ₁ ++ 「 E₁ 」 ++ Δ ⊢ σ) (E₂ : Cover a) (tm₂ : Γ₂ ++ 「 E₂ 」 ++ Δ ⊢ τ) → (E : Cover a) → E ≡ E₁ ⊙ E₂ → Γ₁ ++ 「 E 」 ++ Δ ⊢ σ × Γ₂ ++ 「 E 」 ++ Δ ⊢ τ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ E₁ tm₁ E₂ tm₂ _ (sym s) = let (tm₁ , tm₂) = ⟦⊙⟧⊢ Γ₂ Γ₁ Δ E₂ tm₂ E₁ tm₁ _ s in tm₂ , tm₁ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ .(`κ k) tm₁ .(`κ k) tm₂ ._ (`κ k) = tm₁ , tm₂ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ (S₁ `⊗ T₁) tm₁ (S₂ `⊗ T₂) tm₂ (S `⊗ T) (s₁ `⊗ s₂) = let (tm₁ , tm₂) = ⟦⊙⟧⊢ (Γ₁ ++ 「 S₁ 」) (Γ₂ ++ 「 S₂ 」) Δ T₁ (tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ tm₁) T₂ (tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ tm₂) T s₂ (tm₁ , tm₂) = ⟦⊙⟧⊢ Γ₁ Γ₂ (「 T 」 ++ Δ) S₁ (tm-assoc (Γ₁ ++ 「 S₁ 」) 「 T 」 Δ tm₁) S₂ (tm-assoc (Γ₂ ++ 「 S₂ 」) 「 T 」 Δ tm₂) S s₁ in (tm-group Γ₁ 「 S 」 「 T 」 Δ $ tm-assoc⁻¹ (Γ₁ ++ 「 S 」) 「 T 」 Δ tm₁) , (tm-group Γ₂ 「 S 」 「 T 」 Δ $ tm-assoc⁻¹ (Γ₂ ++ 「 S 」) 「 T 」 Δ tm₂) ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ ([ s ]`⊗ b) = ⟦⊙⟧⊢ Γ₁ Γ₂ Δ _ tm₁ _ tm₂ _ s ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ (a `⊗[ s ]) = ⟦⊙⟧⊢ Γ₁ Γ₂ Δ _ tm₁ _ tm₂ _ s ⟦⊙⟧⊢ Γ₁ Γ₂ Δ .(a `& b) tm₁ .(a `& b) tm₂ ._ (a `& b) = tm₁ , tm₂ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ ] prA [`&] prB [ = ⟦isUsed⟧ Γ₁ Δ (prA `&[ _ ]) tm₁ , ⟦isUsed⟧ Γ₂ Δ ([ _ ]`& prB) tm₂ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ ] prB [`& = ⟦isUsed⟧ Γ₁ Δ ([ _ ]`& prB) tm₁ , tm₂ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ `&] prA [ = ⟦isUsed⟧ Γ₁ Δ (prA `&[ _ ]) tm₁ , tm₂ ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ (s `&[ b ]) = ⟦⊙⟧⊢ Γ₁ Γ₂ Δ _ tm₁ _ tm₂ _ s ⟦⊙⟧⊢ Γ₁ Γ₂ Δ ._ tm₁ ._ tm₂ ._ ([ a ]`& s) = ⟦⊙⟧⊢ Γ₁ Γ₂ Δ _ tm₁ _ tm₂ _ s ⟦⊙⟧─ : {a : ty} {A B₁ B₂ : Cover a} → (E₁ : Cover a) (d₁ : B₁ ≡ A ─ E₁) (E₂ : Cover a) (d₂ : B₂ ≡ A ─ E₂) → {B : Cover a} → B ≡ B₁ ⊙ B₂ → Σ[ E ∈ Cover a ] B ≡ A ─ E × E ≡ E₁ ⊙ E₂ ⟦⊙⟧─ E₁ d₁ E₂ d₂ (sym s) = let (E , d , s) = ⟦⊙⟧─ E₂ d₂ E₁ d₁ s in E , d , sym s ⟦⊙⟧─ ._ (d₁ `⊗ d₂) ._ (d₃ `⊗ d₄) (s₁ `⊗ s₂) = let (F₁ , d₁ , s₁) = ⟦⊙⟧─ _ d₁ _ d₃ s₁ (F₂ , d₂ , s₂) = ⟦⊙⟧─ _ d₂ _ d₄ s₂ in F₁ `⊗ F₂ , d₁ `⊗ d₂ , s₁ `⊗ s₂ ⟦⊙⟧─ ._ (d₁ `⊗ˡ B₁) ._ (d₂ `⊗ˡ .B₁) (s₁ `⊗ s₂) = let (E , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s₁ in E `⊗[ _ ] , Eq.subst (λ B → _ `⊗ B ≡ _ `⊗ _ ─ E `⊗[ _ ]) (Eq.sym $ ⟦A⊙A⟧ s₂) (d `⊗ˡ B₁) , [ s ]`⊗ _ ⟦⊙⟧─ ._ (A₂ `⊗ʳ d₁) ._ (.A₂ `⊗ʳ d₂) (s₁ `⊗ s₂) = let (E , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s₂ in [ _ ]`⊗ E , Eq.subst (λ B → B `⊗ _ ≡ _ `⊗ _ ─ [ _ ]`⊗ E) (Eq.sym $ ⟦A⊙A⟧ s₁) (A₂ `⊗ʳ d) , _ `⊗[ s ] ⟦⊙⟧─ ._ ([ A₁ ]`⊗ˡ B₁) ._ ([ A₂ ]`⊗ˡ .B₁) {A `⊗ B} (s₁ `⊗ s₂) = A `⊗[ _ ] , Eq.subst (λ B → _ `⊗ B ≡ [ _ ]`⊗ _ ─ A `⊗[ _ ]) (Eq.sym $ ⟦A⊙A⟧ s₂) ([ A ]`⊗ˡ B₁) , [ s₁ ]`⊗ _ ⟦⊙⟧─ ._ ([ A₁ ]`⊗ˡʳ d₁) ._ ([ A₂ ]`⊗ˡʳ d₂) {A `⊗ B} (s₁ `⊗ s₂) = let (B , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s₂ in A `⊗ B , [ A ]`⊗ˡʳ d , s₁ `⊗ s ⟦⊙⟧─ ._ (A₁ `⊗ʳ[ B₁ ]) ._ (.A₁ `⊗ʳ[ B₂ ]) {A `⊗ B} (s₁ `⊗ s₂) = [ _ ]`⊗ B , Eq.subst (λ A → A `⊗ _ ≡ _ `⊗[ _ ] ─ [ _ ]`⊗ B) (Eq.sym $ ⟦A⊙A⟧ s₁) (A₁ `⊗ʳ[ B ]) , _ `⊗[ s₂ ] ⟦⊙⟧─ ._ (d₁ `⊗ˡʳ[ B₁ ]) ._ (d₂ `⊗ˡʳ[ B₂ ]) {A `⊗ B} (s₁ `⊗ s₂) = let (A , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s₁ in A `⊗ B , d `⊗ˡʳ[ B ] , s `⊗ s₂ ⟦⊙⟧─ ._ (d₁ `⊗[ b ]) ._ (d₂ `⊗[ .b ]) ([ s ]`⊗ .b) = let (E , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s in E `⊗[ b ] , d `⊗[ b ] , [ s ]`⊗ b ⟦⊙⟧─ ._ ([ σ ]`⊗ d₁) ._ ([ .σ ]`⊗ d₂) (.σ `⊗[ s ]) = let (E , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s in [ σ ]`⊗ E , [ σ ]`⊗ d , σ `⊗[ s ] ⟦⊙⟧─ E₁ () ._ ([ σ ]`& d₂) ] prA [`&] prB [ ⟦⊙⟧─ E₁ d₁ E₂ () ] prB [`& ⟦⊙⟧─ E₁ d₁ E₂ () `&] prA [ ⟦⊙⟧─ ._ (d₁ `&[ b ]) ._ (d₂ `&[ .b ]) (s `&[ .b ]) = let (E , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s in E `&[ b ] , d `&[ b ] , s `&[ b ] ⟦⊙⟧─ ._ ([ σ ]`& d₁) ._ ([ .σ ]`& d₂) ([ .σ ]`& s) = let (E , d , s) = ⟦⊙⟧─ _ d₁ _ d₂ s in [ σ ]`& E , [ σ ]`& d , [ σ ]`& s ⟦⊙⟧─ E₁ () E₂ d₂ (`κ k) ⟦⊙⟧─ E₁ () E₂ d₂ (a `& b) ⟦⊙⟧─ ._ (_ `⊗ d₂) ._ (_ `⊗ˡ _) (_ `⊗ s₂) = ⊥-elim $ ¬⊙diffʳ s₂ d₂ ⟦⊙⟧─ ._ (d₁ `⊗ d₂) ._ (_ `⊗ʳ _) (s₁ `⊗ _) = ⊥-elim $ ¬⊙diffʳ s₁ d₁ ⟦⊙⟧─ ._ (_ `⊗ˡ _) ._ (_ `⊗ d₃) (_ `⊗ s₂) = ⊥-elim $ ¬⊙diffˡ s₂ d₃ ⟦⊙⟧─ ._ (_ `⊗ˡ _) ._ (_ `⊗ʳ d₂) (_ `⊗ s₂) = ⊥-elim $ ¬⊙diffˡ s₂ d₂ ⟦⊙⟧─ ._ (_ `⊗ʳ _) ._ (d₂ `⊗ _) (s₁ `⊗ _) = ⊥-elim $ ¬⊙diffˡ s₁ d₂ ⟦⊙⟧─ ._ (_ `⊗ʳ _) ._ (d₂ `⊗ˡ _) (s₁ `⊗ _) = ⊥-elim $ ¬⊙diffˡ s₁ d₂ ⟦⊙⟧─ ._ ([ _ ]`⊗ˡ _) ._ ([ _ ]`⊗ˡʳ d₂) (_ `⊗ s₂) = ⊥-elim $ ¬⊙diffˡ s₂ d₂ ⟦⊙⟧─ ._ (_ `⊗ʳ[ _ ]) ._ (d₂ `⊗ˡʳ[ _ ]) (s₁ `⊗ _) = ⊥-elim $ ¬⊙diffˡ s₁ d₂ ⟦⊙⟧─ ._ ([ _ ]`⊗ˡʳ d₁) ._ ([ _ ]`⊗ˡ _) (_ `⊗ s₂) = ⊥-elim $ ¬⊙diffʳ s₂ d₁ ⟦⊙⟧─ ._ (d₁ `⊗ˡʳ[ _ ]) ._ (_ `⊗ʳ[ _ ]) (s₁ `⊗ _) = ⊥-elim $ ¬⊙diffʳ s₁ d₁ ⟦⊙⟧ : (Γ₁ Γ₂ Δ : Con ty) {a σ τ : ty} {A B₁ B₂ : Cover a} → (E₁ : Cover a) (d₁ : B₁ ≡ A ─ E₁) (tm₁ : Γ₁ ++ 「 E₁ 」 ++ Δ ⊢ σ) (E₂ : Cover a) (d₂ : B₂ ≡ A ─ E₂) (tm₂ : Γ₂ ++ 「 E₂ 」 ++ Δ ⊢ τ) → {B : Cover a} → B ≡ B₁ ⊙ B₂ → Σ[ E ∈ Cover a ] B ≡ A ─ E × Γ₁ ++ 「 E 」 ++ Δ ⊢ σ × Γ₂ ++ 「 E 」 ++ Δ ⊢ τ ⟦⊙⟧ Γ₁ Γ₂ Δ E₁ d₁ tm₁ E₂ d₂ tm₂ s = let (E , d , s) = ⟦⊙⟧─ E₁ d₁ E₂ d₂ s (tm₁ , tm₂) = ⟦⊙⟧⊢ Γ₁ Γ₂ Δ E₁ tm₁ E₂ tm₂ E s in E , d , tm₁ , tm₂ open Interleaving 「─」 : {a : ty} {S S₁ S₂ : Cover a} (d : S ≡ S₁ ─ S₂) → 「 S 」 ≡ 「 S₁ 」 ⋈ 「 S₂ 」 「─」 (d₁ `⊗ d₂) = 「─」 d₁ Interleaving.++ 「─」 d₂ 「─」 ([ σ ]`⊗ d) = 「─」 d 「─」 (d `⊗[ τ ]) = 「─」 d 「─」 ([ σ ]`& d) = 「─」 d 「─」 (d `&[ τ ]) = 「─」 d 「─」 (d `⊗ˡ T) = 「─」 d Interleaving.++ˡ 「 T 」 「─」 (S `⊗ʳ d) = 「 S 」 Interleaving.ˡ++ 「─」 d 「─」 ([ S ]`⊗ˡ T) = 「 S 」 Interleaving.ʳ++ˡ 「 T 」 「─」 ([ S ]`⊗ˡʳ d) = 「 S 」 Interleaving.ʳ++ 「─」 d 「─」 (S `⊗ʳ[ T ]) = 「 S 」 Interleaving.ˡ++ʳ 「 T 」 「─」 (d `⊗ˡʳ[ T ]) = 「─」 d Interleaving.++ʳ 「 T 」 ⟦>>=⟧ : {σ : ty} {S T U : Cover σ} (Γ₁ Δ₁ Γ₂ Δ₂ : Con ty) {a b : ty} (V₁ : Cover σ) (d₁ : T ≡ S ─ V₁) (tm₁ : Γ₁ ++ 「 V₁ 」 ++ Δ₁ ⊢ a) (V₂ : Cover σ) (d₂ : U ≡ T ─ V₂) (tm₂ : Γ₂ ++ 「 V₂ 」 ++ Δ₂ ⊢ b) → Σ[ V ∈ Cover σ ] Σ[ S₁ ∈ Con ty ] Σ[ S₂ ∈ Con ty ] U ≡ S ─ V × 「 V 」 ≡ S₁ ⋈ S₂ × Γ₁ ++ S₁ ++ Δ₁ ⊢ a × Γ₂ ++ S₂ ++ Δ₂ ⊢ b ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ ([ σ ]`& d₁) tm₁ ._ ([ .σ ]`& d₂) tm₂ = let (T , T₁ , T₂ , d , j , tms) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ d₁ tm₁ _ d₂ tm₂ in [ σ ]`& T , T₁ , T₂ , [ σ ]`& d , j , tms ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ (d₁ `&[ τ ]) tm₁ ._ (d₂ `&[ .τ ]) tm₂ = let (S , S₁ , S₂ , d , j , tms) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ d₁ tm₁ _ d₂ tm₂ in S `&[ τ ] , S₁ , S₂ , d `&[ τ ] , j , tms ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗ T₁) (d₁ `⊗ d₃) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₄) tm₂ = let (T , T₁ , T₂ , dT , jT , tm₁ , tm₂) = ⟦>>=⟧ (Γ₁ ++ 「 S₁ 」) Δ₁ (Γ₂ ++ 「 S₂ 」) Δ₂ _ d₃ (tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁) _ d₄ (tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂) (S , S₁ , S₂ , dS , jS , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ (T₁ ++ Δ₁) Γ₂ (T₂ ++ Δ₂) _ d₁ (tm-assoc (Γ₁ ++ 「 S₁ 」) T₁ Δ₁ tm₁) _ d₂ (tm-assoc (Γ₂ ++ 「 S₂ 」) T₂ Δ₂ tm₂) in S `⊗ T , S₁ ++ T₁ , S₂ ++ T₂ , dS `⊗ dT , jS Interleaving.++ jT , tm-group Γ₁ S₁ T₁ Δ₁ (tm-assoc⁻¹ (Γ₁ ++ S₁) T₁ Δ₁ tm₁) , tm-group Γ₂ S₂ T₂ Δ₂ (tm-assoc⁻¹ (Γ₂ ++ S₂) T₂ Δ₂ tm₂) ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗ T₁) (d₁ `⊗ d₂) tm₁ (S₂ `⊗[ τ ]) (d₃ `⊗ˡ T) tm₂ = let tm₁ = tm-assoc (Γ₁ ++ 「 S₁ 」) 「 T₁ 」 Δ₁ $ tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁ (S , S₁ , S₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ (「 T₁ 」 ++ Δ₁) Γ₂ Δ₂ S₁ d₁ tm₁ S₂ d₃ tm₂ in S `⊗ T₁ , S₁ ++ 「 T₁ 」 , S₂ , d `⊗ d₂ , j Interleaving.++ˡ 「 T₁ 」 , (tm-group Γ₁ S₁ 「 T₁ 」 Δ₁ $ tm-assoc⁻¹ (Γ₁ ++ S₁) 「 T₁ 」 Δ₁ tm₁) , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗ T₁) (d₁ `⊗ d₂) tm₁ ([ σ ]`⊗ T₂) (S `⊗ʳ d₃) tm₂ = let tm₁ = tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁ (T , T₁ , T₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ (Γ₁ ++ 「 S₁ 」) Δ₁ Γ₂ Δ₂ T₁ d₂ tm₁ T₂ d₃ tm₂ in S₁ `⊗ T , 「 S₁ 」 ++ T₁ , T₂ , d₁ `⊗ d , 「 S₁ 」 Interleaving.ˡ++ j , tm-group Γ₁ 「 S₁ 」 T₁ Δ₁ tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ ([ σ ]`⊗ d₁) tm₁ ._ ([ .σ ]`⊗ d₂) tm₂ = let (T , T₁ , T₂ , d , j , tms) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ d₁ tm₁ _ d₂ tm₂ in [ σ ]`⊗ T , T₁ , T₂ , [ σ ]`⊗ d , j , tms ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ σ ]`⊗ T₁) ([ .σ ]`⊗ d₁) tm₁ (.S₂ `⊗[ τ ]) ([ S₂ ]`⊗ˡ T₂) tm₂ = S₂ `⊗ T₁ , 「 T₁ 」 , 「 S₂ 」 , [ S₂ ]`⊗ˡʳ d₁ , 「 S₂ 」 Interleaving.ʳ++ˡ 「 T₁ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ .σ ]`⊗ T₁) ([ σ ]`⊗ d₁) tm₁ (.S₂ `⊗ T₂) ([ S₂ ]`⊗ˡʳ d₂) tm₂ = let (T , T₁ , T₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ Δ₁ (Γ₂ ++ 「 S₂ 」) Δ₂ T₁ d₁ tm₁ T₂ d₂ $ tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂ in S₂ `⊗ T , T₁ , 「 S₂ 」 ++ T₂ , [ S₂ ]`⊗ˡʳ d , 「 S₂ 」 Interleaving.ʳ++ j , tm₁ , tm-group Γ₂ 「 S₂ 」 T₂ Δ₂ tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ (d₁ `⊗[ τ ]) tm₁ ._ (d₂ `⊗[ .τ ]) tm₂ = let (S , S₁ , S₂ , d , j , tms) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ d₁ tm₁ _ d₂ tm₂ in S `⊗[ τ ] , S₁ , S₂ , d `⊗[ τ ] , j , tms ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗[ .τ ]) (d₁ `⊗[ τ ]) tm₁ ([ σ ]`⊗ .T₂) (S₂ `⊗ʳ[ T₂ ]) tm₂ = S₁ `⊗ T₂ , 「 S₁ 」 , 「 T₂ 」 , d₁ `⊗ˡʳ[ T₂ ] , 「 S₁ 」 Interleaving.ˡ++ʳ 「 T₂ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗[ .τ ]) (d₁ `⊗[ τ ]) tm₁ (S₂ `⊗ .T₂) (d₂ `⊗ˡʳ[ T₂ ]) tm₂ = let tm₂ = tm-assoc (Γ₂ ++ 「 S₂ 」) 「 T₂ 」 Δ₂ $ tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂ (S , S₁ , S₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ (「 T₂ 」 ++ Δ₂) _ d₁ tm₁ _ d₂ tm₂ in S `⊗ T₂ , S₁ , S₂ ++ 「 T₂ 」 , d `⊗ˡʳ[ T₂ ] , j Interleaving.++ Interleaving.reflʳ {Γ = 「 T₂ 」} , tm₁ , (tm-group Γ₂ S₂ 「 T₂ 」 Δ₂ $ tm-assoc⁻¹ (Γ₂ ++ S₂) 「 T₂ 」 Δ₂ tm₂) ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗[ τ ]) (d₁ `⊗ˡ T) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₃) tm₂ = let tm₂ = tm-assoc (Γ₂ ++ 「 S₂ 」) 「 T₂ 」 Δ₂ $ tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂ (S , S₁ , S₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ (「 T₂ 」 ++ Δ₂) S₁ d₁ tm₁ S₂ d₂ tm₂ in S `⊗ T₂ , S₁ , S₂ ++ 「 T₂ 」 , d `⊗ d₃ , j Interleaving.++ʳ 「 T₂ 」 , tm₁ , (tm-group Γ₂ S₂ 「 T₂ 」 Δ₂ $ tm-assoc⁻¹ (Γ₂ ++ S₂) 「 T₂ 」 Δ₂ tm₂) ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ (d₁ `⊗ˡ T) tm₁ ._ (d₂ `⊗ˡ .T) tm₂ = let (S , S₁ , S₂ , d , jtms) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ d₁ tm₁ _ d₂ tm₂ in S `⊗[ _ ] , S₁ , S₂ , d `⊗ˡ T , jtms ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗[ τ ]) (d₁ `⊗ˡ T) tm₁ ([ σ ]`⊗ T₂) (S `⊗ʳ d₂) tm₂ = S₁ `⊗ T₂ , 「 S₁ 」 , 「 T₂ 」 , d₁ `⊗ d₂ , 「 S₁ 」 Interleaving.ˡ++ʳ 「 T₂ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ σ ]`⊗ T₁) (S `⊗ʳ d₁) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₃) tm₂ = let (T , T₁ , T₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ Δ₁ (Γ₂ ++ 「 S₂ 」) Δ₂ T₁ d₁ tm₁ T₂ d₃ $ tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂ in S₂ `⊗ T , T₁ , 「 S₂ 」 ++ T₂ , d₂ `⊗ d , 「 S₂ 」 Interleaving.ʳ++ j , tm₁ , tm-group Γ₂ 「 S₂ 」 T₂ Δ₂ tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ σ ]`⊗ T₁) (S `⊗ʳ d₁) tm₁ (S₂ `⊗[ τ ]) (d₂ `⊗ˡ T) tm₂ = S₂ `⊗ T₁ , 「 T₁ 」 , 「 S₂ 」 , d₂ `⊗ d₁ , 「 S₂ 」 Interleaving.ʳ++ˡ 「 T₁ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ (S `⊗ʳ d₁) tm₁ ._ (.S `⊗ʳ d₂) tm₂ = let (T , T₁ , T₂ , d , jtms) = ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ d₁ tm₁ _ d₂ tm₂ in [ _ ]`⊗ T , T₁ , T₂ , S `⊗ʳ d , jtms ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (.S₁ `⊗[ τ ]) ([ S₁ ]`⊗ˡ T) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₃) tm₂ = _ `⊗ T₂ , 「 S₁ 」 , 「 S₂ 」 ++ 「 T₂ 」 , [ _ ]`⊗ˡʳ d₃ , 「─」 d₂ Interleaving.++ʳ 「 T₂ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (.S₁ `⊗[ τ ]) ([ S₁ ]`⊗ˡ T) tm₁ (S₂ `⊗[ .τ ]) (d₂ `⊗ˡ .T) tm₂ = _ , 「 S₁ 」 , 「 S₂ 」 , [ _ ]`⊗ˡ T , 「─」 d₂ , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (.S₁ `⊗[ τ ]) ([ S₁ ]`⊗ˡ T₁) tm₁ ([ σ ]`⊗ T₂) (.S₁ `⊗ʳ d₂) tm₂ = S₁ `⊗ T₂ , 「 S₁ 」 , 「 T₂ 」 , [ _ ]`⊗ˡʳ d₂ , 「 S₁ 」 Interleaving.ˡ++ʳ 「 T₂ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (.S₁ `⊗ T₁) ([ S₁ ]`⊗ˡʳ d₁) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₃) tm₂ = let tm₁ = tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁ tm₂ = tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂ (T , T₁ , T₂ , dT , jT , tm₁ , tm₂) = ⟦>>=⟧ (Γ₁ ++ 「 S₁ 」) Δ₁ (Γ₂ ++ 「 S₂ 」) Δ₂ T₁ d₁ tm₁ T₂ d₃ tm₂ in _ `⊗ T , 「 S₁ 」 ++ T₁ , 「 S₂ 」 ++ T₂ , [ _ ]`⊗ˡʳ dT , 「─」 d₂ Interleaving.++ jT , tm-group Γ₁ 「 S₁ 」 T₁ Δ₁ tm₁ , tm-group Γ₂ 「 S₂ 」 T₂ Δ₂ tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (.S₁ `⊗ T₁) ([ S₁ ]`⊗ˡʳ d₁) tm₁ (S₂ `⊗[ τ ]) (d₂ `⊗ˡ T) tm₂ = _ `⊗ T₁ , 「 S₁ 」 ++ 「 T₁ 」 , 「 S₂ 」 , [ _ ]`⊗ˡʳ d₁ , 「─」 d₂ Interleaving.++ˡ 「 T₁ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (.S₁ `⊗ T₁) ([ S₁ ]`⊗ˡʳ d₁) tm₁ ([ σ ]`⊗ T₂) (.S₁ `⊗ʳ d₂) tm₂ = let tm₁ = tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁ (T , T₁ , T₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ (Γ₁ ++ 「 S₁ 」) Δ₁ Γ₂ Δ₂ T₁ d₁ tm₁ T₂ d₂ tm₂ in S₁ `⊗ T , 「 S₁ 」 ++ T₁ , T₂ , [ S₁ ]`⊗ˡʳ d , 「 S₁ 」 Interleaving.ˡ++ j , tm-group Γ₁ 「 S₁ 」 T₁ Δ₁ tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ σ ]`⊗ .T₁) (S `⊗ʳ[ T₁ ]) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₃) tm₂ = S₂ `⊗ _ , 「 T₁ 」 , 「 S₂ 」 ++ 「 T₂ 」 , d₂ `⊗ˡʳ[ _ ] , 「 S₂ 」 Interleaving.ʳ++ 「─」 d₃ , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ σ ]`⊗ .T₁) (S `⊗ʳ[ T₁ ]) tm₁ (S₂ `⊗[ τ ]) (d₂ `⊗ˡ .T₁) tm₂ = S₂ `⊗ T₁ , 「 T₁ 」 , 「 S₂ 」 , d₂ `⊗ˡʳ[ T₁ ] , 「 S₂ 」 Interleaving.ʳ++ˡ 「 T₁ 」 , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ([ σ ]`⊗ .T₁) (S `⊗ʳ[ T₁ ]) tm₁ ([ .σ ]`⊗ T₂) (.S `⊗ʳ d₂) tm₂ = [ σ ]`⊗ _ , 「 T₁ 」 , 「 T₂ 」 , S `⊗ʳ[ _ ] , 「─」 d₂ , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗ .T₁) (d₁ `⊗ˡʳ[ T₁ ]) tm₁ (S₂ `⊗ T₂) (d₂ `⊗ d₃) tm₂ = let tm₁ = tm-assoc (Γ₁ ++ 「 S₁ 」) 「 T₁ 」 Δ₁ $ tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁ tm₂ = tm-assoc (Γ₂ ++ 「 S₂ 」) 「 T₂ 」 Δ₂ $ tm-group⁻¹ Γ₂ 「 S₂ 」 「 T₂ 」 Δ₂ tm₂ (S , S₁ , S₂ , dS , jS , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ (「 T₁ 」 ++ Δ₁) Γ₂ (「 T₂ 」 ++ Δ₂) S₁ d₁ tm₁ S₂ d₂ tm₂ in S `⊗ _ , S₁ ++ 「 T₁ 」 , S₂ ++ 「 T₂ 」 , dS `⊗ˡʳ[ _ ] , jS Interleaving.++ 「─」 d₃ , (tm-group Γ₁ S₁ 「 T₁ 」 Δ₁ $ tm-assoc⁻¹ (Γ₁ ++ S₁) 「 T₁ 」 Δ₁ tm₁) , (tm-group Γ₂ S₂ 「 T₂ 」 Δ₂ $ tm-assoc⁻¹ (Γ₂ ++ S₂) 「 T₂ 」 Δ₂ tm₂) ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗ .T₁) (d₁ `⊗ˡʳ[ T₁ ]) tm₁ (S₂ `⊗[ τ ]) (d₂ `⊗ˡ .T₁) tm₂ = let tm₁ = tm-assoc (Γ₁ ++ 「 S₁ 」) 「 T₁ 」 Δ₁ $ tm-group⁻¹ Γ₁ 「 S₁ 」 「 T₁ 」 Δ₁ tm₁ (S , S₁ , S₂ , d , j , tm₁ , tm₂) = ⟦>>=⟧ Γ₁ (「 T₁ 」 ++ Δ₁) Γ₂ Δ₂ S₁ d₁ tm₁ S₂ d₂ tm₂ in S `⊗ T₁ , S₁ ++ 「 T₁ 」 , S₂ , d `⊗ˡʳ[ T₁ ] , j Interleaving.++ˡ 「 T₁ 」 , (tm-group Γ₁ S₁ 「 T₁ 」 Δ₁ $ tm-assoc⁻¹ (Γ₁ ++ S₁) 「 T₁ 」 Δ₁ tm₁) , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ (S₁ `⊗ .T₁) (d₁ `⊗ˡʳ[ T₁ ]) tm₁ ([ σ ]`⊗ T₂) (S `⊗ʳ d₂) tm₂ = S₁ `⊗ _ , 「 S₁ 」 ++ 「 T₁ 」 , 「 T₂ 」 , d₁ `⊗ˡʳ[ _ ] , 「 S₁ 」 Interleaving.ˡ++ 「─」 d₂ , tm₁ , tm₂ module Usage where open Linearity.Type Pr open Linearity.Type.Usage Pr open Consumption.Type.Usage Pr open Action.Type.Usage Pr ⟦⊙⟧ : (Γ₁ Γ₂ Δ : Con ty) {a σ τ : ty} {A : Usage a} {B₁ B₂ : Usage a} → (E₁ : Usage a) (d₁ : B₁ ≡ A ─ E₁) (tm₁ : Γ₁ ++ 「 E₁ 」 ++ Δ ⊢ σ) (E₂ : Usage a) (d₂ : B₂ ≡ A ─ E₂) (tm₂ : Γ₂ ++ 「 E₂ 」 ++ Δ ⊢ τ) {B : Usage a} → B ≡ B₁ ⊙ B₂ → Σ[ E ∈ Usage a ] B ≡ A ─ E × Γ₁ ++ 「 E 」 ++ Δ ⊢ σ × Γ₂ ++ 「 E 」 ++ Δ ⊢ τ ⟦⊙⟧ Γ₁ Γ₂ Δ .([ a ]) `idˡ tm₁ .([ a ]) `idˡ tm₂ [ a ] = [ a ] , `idˡ , tm₁ , tm₂ ⟦⊙⟧ Γ₁ Γ₂ Δ .([ a ]) `idˡ tm₁ .([ a ]) `idʳ tm₂ [ a ] = [ a ] , `idˡ , tm₁ , tm₂ ⟦⊙⟧ Γ₁ Γ₂ Δ .([ a ]) `idʳ tm₁ .([ a ]) `idˡ tm₂ [ a ] = [ a ] , `idˡ , tm₁ , tm₂ ⟦⊙⟧ Γ₁ Γ₂ Δ .([ a ]) `idʳ tm₁ .([ a ]) `idʳ tm₂ [ a ] = [ a ] , `idˡ , tm₁ , tm₂ ⟦⊙⟧ Γ₁ Γ₂ Δ ._ `idˡ tm₁ ._ `idˡ tm₂ ] prA [ = [ _ ] , pr , tm₁ , tm₂ where pr = Eq.subst (λ A → ] _ [ ≡ ] A [ ─ [ _ ]) (Cover.⟦A⊙A⟧ prA) `idˡ ⟦⊙⟧ Γ₁ Γ₂ Δ ._ `idʳ tm₁ ._ `idʳ tm₂ ] prA [ = ] _ [ , `idʳ , Cover.⟦⊙⟧⊢ Γ₁ Γ₂ Δ _ tm₁ _ tm₂ _ prA ⟦⊙⟧ Γ₁ Γ₂ Δ ._ ] prS₁ [ tm₁ ._ ] prS₂ [ tm₂ ] prA [ = let (S , prS , tms) = Cover.⟦⊙⟧ Γ₁ Γ₂ Δ _ prS₁ tm₁ _ prS₂ tm₂ prA in ] S [ , ] prS [ , tms ⟦⊙⟧ _ _ _ ._ `idˡ _ ._ ] prS [ _ ] prA [ = ⊥-elim $ Cover.¬⊙diffˡ prA prS ⟦⊙⟧ _ _ _ ._ ] prS [ _ ._ `idˡ _ ] prA [ = ⊥-elim $ Cover.¬⊙diffʳ prA prS open Interleaving ⟦>>=⟧ : {σ : ty} {S T U : Usage σ} (Γ₁ Δ₁ Γ₂ Δ₂ : Con ty) {a b : ty} (V₁ : Usage σ) (d₁ : T ≡ S ─ V₁) (tm₁ : Γ₁ ++ 「 V₁ 」 ++ Δ₁ ⊢ a) (V₂ : Usage σ) (d₂ : U ≡ T ─ V₂) (tm₂ : Γ₂ ++ 「 V₂ 」 ++ Δ₂ ⊢ b) → Σ[ V ∈ Usage σ ] Σ[ S₁ ∈ Con ty ] Σ[ S₂ ∈ Con ty ] U ≡ S ─ V × 「 V 」 ≡ S₁ ⋈ S₂ × Γ₁ ++ S₁ ++ Δ₁ ⊢ a × Γ₂ ++ S₂ ++ Δ₂ ⊢ b ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ V₁ d₁ tm₁ ._ `idˡ tm₂ = V₁ , 「 V₁ 」 , ε , d₁ , Interleaving.reflˡ , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ `idˡ tm₁ V₂ d₂ tm₂ = V₂ , ε , 「 V₂ 」 , d₂ , Interleaving.reflʳ , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ `idʳ tm₁ V₂ `idʳ tm₂ = V₂ , ε , 「 V₂ 」 , `idʳ , Interleaving.reflʳ , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ] V₁ [ `idʳ tm₁ ] V₂ [ ] pr [ tm₂ = _ , Cover.「 V₁ 」 , Cover.「 V₂ 」 , `idʳ , Cover.「─」 pr , tm₁ , tm₂ ⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ ._ ] prS [ tm₁ ._ ] prT [ tm₂ = let (S , S₁ , S₂ , d , jtms) = Cover.⟦>>=⟧ Γ₁ Δ₁ Γ₂ Δ₂ _ prS tm₁ _ prT tm₂ in ] S [ , S₁ , S₂ , ] d [ , jtms module Context where open Con open Context open IMLL.Type Pr open IMLL Pr open IMLL.RewriteRules Pr open Pointwise open Context.Context open Consumption.Context Pr open Action.Context Pr open Linearity Pr open Linearity.Context Pr ⟦⊙⟧ : {γ : Con ty} (δ : Con ty) (Γ : Usage γ) {σ τ : ty} (Δ₁ Δ₂ : Usage γ) (E₁ : Usage γ) (d₁ : Δ₁ ≡ Γ ─ E₁) (tm₁ : 「 E₁ 」 ++ δ ⊢ σ) (E₂ : Usage γ) (d₂ : Δ₂ ≡ Γ ─ E₂) (tm₂ : 「 E₂ 」 ++ δ ⊢ τ) {Δ : Usage γ} → Δ ≡ Δ₁ ⊙ Δ₂ → Σ[ E ∈ Usage γ ] Δ ≡ Γ ─ E × 「 E 」 ++ δ ⊢ σ × 「 E 」 ++ δ ⊢ τ ⟦⊙⟧ δ ε ε ε ε d₁ tm₁ ε d₂ tm₂ ε = ε , ε , tm₁ , tm₂ ⟦⊙⟧ {γ ∙ a} δ (Γ ∙ S) (Δ₁ ∙ D₁) (Δ₂ ∙ D₂) (E₁ ∙ e₁) (d₁ ∙ t₁) tm₁ (E₂ ∙ e₂) (d₂ ∙ t₂) tm₂ (sync ∙ prS) = let (f , df , tmσ , tmτ) = Type.Usage.⟦⊙⟧ 「 E₁ 」 「 E₂ 」 δ e₁ t₁ tm₁ e₂ t₂ tm₂ prS (E , dE , tmσ , tmτ) = ⟦⊙⟧ (LTU.「 f 」 ++ δ) Γ Δ₁ Δ₂ E₁ d₁ (tm-assoc 「 E₁ 」 LTU.「 f 」 δ tmσ) E₂ d₂ (tm-assoc 「 E₂ 」 LTU.「 f 」 δ tmτ) sync in E ∙ f , dE ∙ df , tm-assoc⁻¹ 「 E 」 LTU.「 f 」 δ tmσ , tm-assoc⁻¹ 「 E 」 LTU.「 f 」 δ tmτ ⟦&ʳ⟧ : {γ : Con ty} {Γ : Usage γ} {σ τ : ty} {Δ₁ Δ₂ : Usage γ} → Σ[ E ∈ Usage γ ] Δ₁ ≡ Γ ─ E × 「 E 」 ⊢ σ → Σ[ E ∈ Usage γ ] Δ₂ ≡ Γ ─ E × 「 E 」 ⊢ τ → (Δ : Usage γ) → Δ ≡ Δ₁ ⊙ Δ₂ → Σ[ E ∈ Usage γ ] Δ ≡ Γ ─ E × 「 E 」 ⊢ σ × 「 E 」 ⊢ τ ⟦&ʳ⟧ (E₁ , d₁ , tm₁) (E₂ , d₂ , tm₂) Δ = ⟦⊙⟧ ε _ _ _ E₁ d₁ tm₁ E₂ d₂ tm₂ open Interleaving open Interleaving.RewriteRules ⟦>>=⟧ : (γ : Con ty) {Γ Δ E : Usage γ} (C A B : Con ty) {σ τ : ty} (pr : C ≡ A ⋈ B) (F₁ : Usage γ) (d₁ : Δ ≡ Γ ─ F₁) (tm₁ : 「 F₁ 」 ++ A ⊢ σ) (F₂ : Usage γ) (d₂ : E ≡ Δ ─ F₂) (tm₂ : 「 F₂ 」 ++ B ⊢ τ) → Σ[ F ∈ Usage γ ] Σ[ E₁ ∈ Con ty ] Σ[ E₂ ∈ Con ty ] E ≡ Γ ─ F × 「 F 」 ++ C ≡ E₁ ++ A ⋈ E₂ ++ B × E₁ ++ A ⊢ σ × E₂ ++ B ⊢ τ ⟦>>=⟧ ε C A B pr ε ε h₁ ε ε h₂ = ε , ε , ε , ε , ε Interleaving.++ pr , h₁ , h₂ ⟦>>=⟧ (γ ∙ σ) C A B pr (F₁ ∙ V₁) (D₁ ∙ d₁) tm₁ (F₂ ∙ V₂) (D₂ ∙ d₂) tm₂ = let (V , V₁ , V₂ , d , j , tm₁ , tm₂) = Type.Usage.⟦>>=⟧ 「 F₁ 」 A 「 F₂ 」 B V₁ d₁ tm₁ V₂ d₂ tm₂ (F , F₁ , F₂ , D , J , tm₁ , tm₂) = ⟦>>=⟧ γ (LTU.「 V 」 ++ C) (V₁ ++ A) (V₂ ++ B) (j Interleaving.++ pr) F₁ D₁ (tm-assoc 「 F₁ 」 V₁ A tm₁) F₂ D₂ (tm-assoc 「 F₂ 」 V₂ B tm₂) in F ∙ V , F₁ ++ V₁ , F₂ ++ V₂ , D ∙ d , ⋈-assoc⁻¹ 「 F 」 C F₁ A F₂ B J , tm-assoc⁻¹ F₁ V₁ A tm₁ , tm-assoc⁻¹ F₂ V₂ B tm₂ ⟦⊗ʳ⟧ : {γ : Con ty} {Γ Δ E : Usage γ} {σ τ : ty} → Σ[ F ∈ Usage γ ] Δ ≡ Γ ─ F × 「 F 」 ⊢ σ → Σ[ F ∈ Usage γ ] E ≡ Δ ─ F × 「 F 」 ⊢ τ → Σ[ F ∈ Usage γ ] Σ[ E₁ ∈ Con ty ] Σ[ E₂ ∈ Con ty ] E ≡ Γ ─ F × 「 F 」 ≡ E₁ ⋈ E₂ × E₁ ⊢ σ × E₂ ⊢ τ ⟦⊗ʳ⟧ (F₁ , d₁ , tm₁) (F₂ , d₂ , tm₂) = ⟦>>=⟧ _ ε ε ε ε F₁ d₁ tm₁ F₂ d₂ tm₂ open Calculus ⟦_⟧ : {γ : Con ty} {Γ : Usage γ} {σ : ty} {Δ : Usage γ} (pr : Γ ⊢ σ ⊣ Δ) → Σ[ E ∈ Usage γ ] Δ ≡ Γ ─ E × 「 E 」 ⊢ σ ⟦ `κ pr ⟧ = BTC.Soundness.⟦ pr ⟧ ⟦ prσ `⊗ʳ prτ ⟧ = let (F , E₁ , E₂ , diff , inter , tmσ , tmτ) = ⟦⊗ʳ⟧ ⟦ prσ ⟧ ⟦ prτ ⟧ in F , diff , tmσ `⊗ʳ tmτ by inter ⟦ prσ `&ʳ prτ by acc ⟧ = let (E , diff , tmσ , tmτ) = ⟦&ʳ⟧ ⟦ prσ ⟧ ⟦ prτ ⟧ _ acc in E , diff , tmσ `&ʳ tmτ