import lps.IMLL as IMLL
import lps.Linearity as Linearity
import lps.Linearity.Consumption as Consumption
open import Data.Empty
open import Data.Product hiding (map)
open import Function
import lib.Context as Con
module BT = Con.BelongsTo
module BTT = BT.BelongsTo
open import lib.Maybe
open import lib.Nullary
open import Relation.Nullary
open import Relation.Binary.PropositionalEquality as Eq using (_≡_)
module lps.Search.BelongsTo (Pr : Set) (_≟_ : (x y : Pr) → Dec (x ≡ y)) where
module Type where
open Con.Context
open IMLL.Type Pr
module Cover where
open Linearity.Type Pr
module FromFree where
infix 4 _∈[_]▸_
data _∈[_]▸_ (k : Pr) : (σ : ty) (S : Cover σ) → Set where
`κ : k ∈[ `κ k ]▸ `κ k
_`&ˡ_ : {σ : ty} {S : Cover σ} (prS : k ∈[ σ ]▸ S) (τ : ty) →
k ∈[ σ `& τ ]▸ S `&[ τ ]
_`&ʳ_ : (σ : ty) {τ : ty} {T : Cover τ} (prT : k ∈[ τ ]▸ T) →
k ∈[ σ `& τ ]▸ [ σ ]`& T
_`⊗ˡ_ : {σ : ty} {S : Cover σ} (prS : k ∈[ σ ]▸ S) (τ : ty) →
k ∈[ σ `⊗ τ ]▸ S `⊗[ τ ]
_`⊗ʳ_ : (σ : ty) {τ : ty} {T : Cover τ} (prT : k ∈[ τ ]▸ T) →
k ∈[ σ `⊗ τ ]▸ [ σ ]`⊗ T
infix 4 [_]∋_∈_
[_]∋_∈_ : (σ : ty) (k : Pr) (T : Cover σ) → Set
[ σ ]∋ k ∈ τ = k ∈[ σ ]▸ τ
∈κ : ∀ k {l} → k ≡ l → Σ[ C ∈ Cover $ `κ l ] [ `κ l ]∋ k ∈ C
∈κ k Eq.refl = `κ k , `κ
∈[&]ˡ : ∀ {k σ} (τ : ty) → Σ[ S ∈ Cover σ ] [ σ ]∋ k ∈ S →
Σ[ ST ∈ Cover $ σ `& τ ] [ σ `& τ ]∋ k ∈ ST
∈[&]ˡ τ (S , prS) = S `&[ τ ] , prS `&ˡ τ
∈[&]ʳ : ∀ {k τ} (σ : ty) → Σ[ T ∈ Cover τ ] [ τ ]∋ k ∈ T →
Σ[ ST ∈ Cover $ σ `& τ ] [ σ `& τ ]∋ k ∈ ST
∈[&]ʳ σ (T , prT) = [ σ ]`& T , σ `&ʳ prT
∈[⊗]ˡ : ∀ {k σ} (τ : ty) → Σ[ S ∈ Cover σ ] [ σ ]∋ k ∈ S →
Σ[ ST ∈ Cover $ σ `⊗ τ ] [ σ `⊗ τ ]∋ k ∈ ST
∈[⊗]ˡ τ (S , prS) = S `⊗[ τ ] , prS `⊗ˡ τ
∈[⊗]ʳ : ∀ {k τ} (σ : ty) → Σ[ T ∈ Cover τ ] [ τ ]∋ k ∈ T →
Σ[ ST ∈ Cover $ σ `⊗ τ ] [ σ `⊗ τ ]∋ k ∈ ST
∈[⊗]ʳ σ (T , prT) = [ σ ]`⊗ T , σ `⊗ʳ prT
open Context
infix 6 _∈?[_]
_∈?[_] : (k : Pr) (σ : ty) → Con (Σ[ S′ ∈ Cover σ ] [ σ ]∋ k ∈ S′)
k ∈?[ `κ l ] = dec (k ≟ l) (return ∘ ∈κ k) (const ε)
k ∈?[ σ `⊗ τ ] = map (∈[⊗]ˡ τ) (k ∈?[ σ ]) ++ map (∈[⊗]ʳ σ) (k ∈?[ τ ])
k ∈?[ σ `& τ ] = map (∈[&]ˡ τ) (k ∈?[ σ ]) ++ map (∈[&]ʳ σ) (k ∈?[ τ ])
∈?[]-complete : (k : Pr) (σ : ty) {T : Cover σ} (pr : [ σ ]∋ k ∈ T) →
(T , pr) BT.∈ k ∈?[ σ ]
∈?[]-complete k (`κ l) pr with k ≟ l
∈?[]-complete k (`κ .k) `κ | yes Eq.refl = BT.zro
∈?[]-complete k (`κ .k) `κ | no ¬eq = ⊥-elim $ ¬eq Eq.refl
∈?[]-complete k (σ `⊗ τ) (pr `⊗ˡ .τ) = BTT.∈++ˡ (map (∈[⊗]ʳ σ) (k ∈?[ τ ]))
(BTT.map (∈[⊗]ˡ τ) (∈?[]-complete k σ pr))
∈?[]-complete k (σ `⊗ τ) (.σ `⊗ʳ pr) = BTT.∈++ʳ (BTT.map (∈[⊗]ʳ σ) (∈?[]-complete k τ pr))
∈?[]-complete k (σ `& τ) (pr `&ˡ .τ) = BTT.∈++ˡ (map (∈[&]ʳ σ) (k ∈?[ τ ]))
(BTT.map (∈[&]ˡ τ) (∈?[]-complete k σ pr))
∈?[]-complete k (σ `& τ) (.σ `&ʳ pr) = BTT.∈++ʳ (BTT.map (∈[&]ʳ σ) (∈?[]-complete k τ pr))
open IMLL Pr
open Linearity.LTC Pr
⟦_⟧ : {σ : ty} {k : Pr} {T : Cover σ} (pr : [ σ ]∋ k ∈ T) → 「 T 」 ⊢ `κ k
⟦ `κ ⟧ = `v
⟦ pr `&ˡ τ ⟧ = ⟦ pr ⟧
⟦ σ `&ʳ pr ⟧ = ⟦ pr ⟧
⟦ pr `⊗ˡ τ ⟧ = ⟦ pr ⟧
⟦ σ `⊗ʳ pr ⟧ = ⟦ pr ⟧
module FromDented where
open FromFree hiding (⟦_⟧)
infix 4 _∈_▸_
data _∈_▸_ (k : Pr) : {σ : ty} (S : Cover σ) (T : Cover σ) → Set where
_`⊗ˡ_ : {σ : ty} {S S′ : Cover σ} (s : k ∈ S ▸ S′)
{τ : ty} (T : Cover τ) → k ∈ S `⊗ T ▸ S′ `⊗ T
_`⊗ʳ_ : {σ : ty} (S : Cover σ) {τ : ty} {T T′ : Cover τ}
(t : k ∈ T ▸ T′) → k ∈ S `⊗ T ▸ S `⊗ T′
[_]`⊗_ : (σ : ty) {τ : ty} {T T′ : Cover τ} (t : k ∈ T ▸ T′) →
k ∈ [ σ ]`⊗ T ▸ [ σ ]`⊗ T′
_`⊗ʳ[_] : {σ : ty} (S : Cover σ) {τ : ty} {T : Cover τ}
(prT : k ∈[ τ ]▸ T) → k ∈ S `⊗[ τ ] ▸ S `⊗ T
[_]`⊗ˡ_ : {σ : ty} {S : Cover σ} (prS : k ∈[ σ ]▸ S)
{τ : ty} (T : Cover τ) → k ∈ [ σ ]`⊗ T ▸ S `⊗ T
_`⊗[_] : {σ : ty} {S S′ : Cover σ} (s : k ∈ S ▸ S′) (τ : ty) →
k ∈ S `⊗[ τ ] ▸ S′ `⊗[ τ ]
_`&ˡ_ : ∀ {σ} {S S′ : Cover σ} (s : k ∈ S ▸ S′) τ →
k ∈ S `&[ τ ] ▸ S′ `&[ τ ]
_`&ʳ_ : ∀ σ {τ} {T T′ : Cover τ} (t : k ∈ T ▸ T′) →
k ∈ [ σ ]`& T ▸ [ σ ]`& T′
infix 4 _∋_∈_
_∋_∈_ : {σ : ty} (S : Cover σ) (k : Pr) (T : Cover σ) → Set
σ ∋ k ∈ τ = k ∈ σ ▸ τ
∈⊗ˡ : ∀ {k a b} {A : Cover a} (B : Cover b) →
Σ[ A′ ∈ Cover a ] A ∋ k ∈ A′ →
Σ[ AB ∈ Cover $ a `⊗ b ] A `⊗ B ∋ k ∈ AB
∈⊗ˡ B (A′ , prA) = A′ `⊗ B , prA `⊗ˡ B
∈⊗ʳ : ∀ {k a b} (A : Cover a) {B : Cover b} →
Σ[ B′ ∈ Cover b ] B ∋ k ∈ B′ →
Σ[ AB ∈ Cover $ a `⊗ b ] A `⊗ B ∋ k ∈ AB
∈⊗ʳ A (B′ , prB) = A `⊗ B′ , A `⊗ʳ prB
∈[]⊗ : ∀ {k : Pr} {b : ty} {B : Cover b} (a : ty) →
Σ[ B′ ∈ Cover b ] B ∋ k ∈ B′ →
Σ[ AB ∈ Cover $ a `⊗ b ] [ a ]`⊗ B ∋ k ∈ AB
∈[]⊗ a (B′ , prB) = [ a ]`⊗ B′ , [ a ]`⊗ prB
∈[]⊗ˡ : ∀ {k : Pr} {b : ty} (B : Cover b) {a : ty} →
Σ[ A ∈ Cover a ] [ a ]∋ k ∈ A →
Σ[ AB ∈ Cover $ a `⊗ b ] [ a ]`⊗ B ∋ k ∈ AB
∈[]⊗ˡ B (A , prA) = A `⊗ B , [ prA ]`⊗ˡ B
∈⊗[] : ∀ {k : Pr} {a : ty} {A : Cover a} (b : ty) →
Σ[ A′ ∈ Cover a ] A ∋ k ∈ A′ →
Σ[ AB ∈ Cover $ a `⊗ b ] A `⊗[ b ] ∋ k ∈ AB
∈⊗[] b (A′ , prA) = A′ `⊗[ b ] , prA `⊗[ b ]
∈⊗[]ʳ : ∀ {k : Pr} {a : ty} (A : Cover a) {b : ty} →
Σ[ B ∈ Cover b ] [ b ]∋ k ∈ B →
Σ[ AB ∈ Cover $ a `⊗ b ] A `⊗[ b ] ∋ k ∈ AB
∈⊗[]ʳ A (B , prB) = A `⊗ B , A `⊗ʳ[ prB ]
∈[]& : ∀ {k : Pr} {b : ty} {B : Cover b} (a : ty) →
Σ[ B′ ∈ Cover b ] B ∋ k ∈ B′ →
Σ[ AB ∈ Cover $ a `& b ] [ a ]`& B ∋ k ∈ AB
∈[]& a (B′ , prB) = [ a ]`& B′ , a `&ʳ prB
∈&[] : ∀ {k : Pr} {a : ty} {A : Cover a} (b : ty) →
Σ[ A′ ∈ Cover a ] A ∋ k ∈ A′ →
Σ[ AB ∈ Cover $ a `& b ] A `&[ b ] ∋ k ∈ AB
∈&[] b (A′ , prA) = A′ `&[ b ] , prA `&ˡ b
open Context
infix 6 _∈?_
_∈?_ : (k : Pr) {σ : ty} (S : Cover σ) → Con (Σ[ S′ ∈ Cover σ ] S ∋ k ∈ S′)
k ∈? `κ l = ε
k ∈? A `⊗ B = map (∈⊗ˡ B) (k ∈? A) ++ map (∈⊗ʳ A) (k ∈? B)
k ∈? [ a ]`⊗ B = map (∈[]⊗ˡ B) (k ∈?[ a ]) ++ map (∈[]⊗ a) (k ∈? B)
k ∈? A `⊗[ b ] = map (∈⊗[] b) (k ∈? A) ++ map (∈⊗[]ʳ A) (k ∈?[ b ])
k ∈? a `& b = ε
k ∈? A `&[ b ] = map (∈&[] b) (k ∈? A)
k ∈? [ a ]`& B = map (∈[]& a) (k ∈? B)
∈?-complete : (k : Pr) {σ : ty} (S : Cover σ) {T : Cover σ} (pr : S ∋ k ∈ T) →
(T , pr) BT.∈ k ∈? S
∈?-complete k (`κ l) ()
∈?-complete k (S `⊗ T) (pr `⊗ˡ .T) = BTT.∈++ˡ (map (∈⊗ʳ S) (k ∈? T))
(BTT.map (∈⊗ˡ T) (∈?-complete k S pr))
∈?-complete k (S `⊗ T) (.S `⊗ʳ pr) = BTT.∈++ʳ (BTT.map (∈⊗ʳ S) (∈?-complete k T pr))
∈?-complete k ([ σ ]`⊗ T) ([ .σ ]`⊗ pr) = BTT.∈++ʳ (BTT.map (∈[]⊗ σ) (∈?-complete k T pr))
∈?-complete k ([ σ ]`⊗ T) ([ pr ]`⊗ˡ .T) = BTT.∈++ˡ (map (∈[]⊗ σ) (k ∈? T))
(BTT.map (∈[]⊗ˡ T) (∈?[]-complete k σ pr))
∈?-complete k (S `⊗[ τ ]) (.S `⊗ʳ[ pr ]) = BTT.∈++ʳ (BTT.map (∈⊗[]ʳ S) (∈?[]-complete k τ pr))
∈?-complete k (S `⊗[ τ ]) (pr `⊗[ .τ ]) = BTT.∈++ˡ (map (∈⊗[]ʳ S) (k ∈?[ τ ]))
(BTT.map (∈⊗[] τ) (∈?-complete k S pr))
∈?-complete k (σ `& τ) ()
∈?-complete k (S `&[ τ ]) (pr `&ˡ .τ) = BTT.map (∈&[] τ) (∈?-complete k S pr)
∈?-complete k ([ σ ]`& T) (.σ `&ʳ pr) = BTT.map (∈[]& σ) (∈?-complete k T pr)
open IMLL Pr
open Linearity.LTC Pr
open Consumption.LCT.Cover Pr
⟦⊗ˡ⟧ : ∀ {σ k} τ {S₁ S₂ : Cover σ} (T : Cover τ) →
Σ[ S ∈ Cover σ ] S₂ ≡ S₁ ─ S × 「 S 」 ⊢ `κ k →
Σ[ ST ∈ Cover $ σ `⊗ τ ] S₂ `⊗ T ≡ S₁ `⊗ T ─ ST × 「 ST 」 ⊢ `κ k
⟦⊗ˡ⟧ τ T (S , diff , tm) = S `⊗[ τ ] , diff `⊗ˡ T , tm
⟦⊗ʳ⟧ : ∀ σ {τ k} (S : Cover σ) {T₁ T₂ : Cover τ} →
Σ[ T ∈ Cover τ ] T₂ ≡ T₁ ─ T × 「 T 」 ⊢ `κ k →
Σ[ ST ∈ Cover $ σ `⊗ τ ] S `⊗ T₂ ≡ S `⊗ T₁ ─ ST × 「 ST 」 ⊢ `κ k
⟦⊗ʳ⟧ σ S (T , diff , tm) = [ σ ]`⊗ T , S `⊗ʳ diff , tm
⟦⊗[]⟧ : ∀ {σ k} τ {S₁ S₂ : Cover σ} →
Σ[ S ∈ Cover σ ] S₂ ≡ S₁ ─ S × 「 S 」 ⊢ `κ k →
Σ[ ST ∈ Cover $ σ `⊗ τ ] S₂ `⊗[ τ ] ≡ S₁ `⊗[ τ ] ─ ST × 「 ST 」 ⊢ `κ k
⟦⊗[]⟧ τ (S , diff , tm) = S `⊗[ τ ] , diff `⊗[ τ ] , tm
⟦[]⊗⟧ : ∀ σ {τ k} {T₁ T₂ : Cover τ} →
Σ[ T ∈ Cover τ ] T₂ ≡ T₁ ─ T × 「 T 」 ⊢ `κ k →
Σ[ ST ∈ Cover $ σ `⊗ τ ] [ σ ]`⊗ T₂ ≡ [ σ ]`⊗ T₁ ─ ST × 「 ST 」 ⊢ `κ k
⟦[]⊗⟧ σ (T , diff , tm) = [ σ ]`⊗ T , [ σ ]`⊗ diff , tm
⟦&ˡ⟧ : ∀ {σ} {S₁ S₂ : Cover σ} τ {k} →
Σ[ S ∈ Cover σ ] S₂ ≡ S₁ ─ S × 「 S 」 ⊢ `κ k →
Σ[ ST ∈ Cover $ σ `& τ ] S₂ `&[ τ ] ≡ S₁ `&[ τ ] ─ ST × 「 ST 」 ⊢ `κ k
⟦&ˡ⟧ τ {k} (S , diff , tm) = S `&[ τ ] , diff `&[ τ ] , tm
⟦&ʳ⟧ : ∀ σ {τ} {T₁ T₂ : Cover τ} {k} →
Σ[ T ∈ Cover τ ] T₂ ≡ T₁ ─ T × 「 T 」 ⊢ `κ k →
Σ[ ST ∈ Cover $ σ `& τ ] [ σ ]`& T₂ ≡ [ σ ]`& T₁ ─ ST × 「 ST 」 ⊢ `κ k
⟦&ʳ⟧ σ (T , diff , tm) = [ σ ]`& T , [ σ ]`& diff , tm
⟦_⟧ : {σ : ty} {S : Cover σ} {k : Pr} {T : Cover σ} (pr : S ∋ k ∈ T) →
Σ[ E ∈ Cover σ ] T ≡ S ─ E × 「 E 」 ⊢ `κ k
⟦ pr `⊗ˡ T ⟧ = ⟦⊗ˡ⟧ _ _ ⟦ pr ⟧
⟦ S `⊗ʳ pr ⟧ = ⟦⊗ʳ⟧ _ _ ⟦ pr ⟧
⟦ [ σ ]`⊗ pr ⟧ = ⟦[]⊗⟧ _ ⟦ pr ⟧
⟦ S `⊗ʳ[ prT ] ⟧ = [ _ ]`⊗ _ , S `⊗ʳ[ _ ] , FromFree.⟦ prT ⟧
⟦ [ prS ]`⊗ˡ T ⟧ = _ `⊗[ _ ] , [ _ ]`⊗ˡ T , FromFree.⟦ prS ⟧
⟦ pr `⊗[ τ ] ⟧ = ⟦⊗[]⟧ _ ⟦ pr ⟧
⟦ pr `&ˡ τ ⟧ = ⟦&ˡ⟧ _ ⟦ pr ⟧
⟦ σ `&ʳ pr ⟧ = ⟦&ʳ⟧ _ ⟦ pr ⟧
module Usage where
open Cover
open Linearity.Type Pr
infix 4 _∈_▸_
data _∈_▸_ (k : Pr) : {σ : ty} (S : Usage σ) (T : Usage σ) → Set where
[_] : {σ : ty} {S : Cover σ} (prS : FromFree.[ σ ]∋ k ∈ S) →
k ∈ [ σ ] ▸ ] S [
]_[ : {σ : ty} {S S′ : Cover σ} (prS : S FromDented.∋ k ∈ S′) →
k ∈ ] S [ ▸ ] S′ [
infix 4 _∋_∈_
_∋_∈_ : {σ : ty} (S : Usage σ) (k : Pr) (T : Usage σ) → Set
σ ∋ k ∈ τ = k ∈ σ ▸ τ
open Context
[∈] : ∀ {k σ} → Σ[ S ∈ Cover σ ] FromFree.[ σ ]∋ k ∈ S →
Σ[ S ∈ Usage σ ] [ σ ] ∋ k ∈ S
[∈] (S , prS) = ] S [ , [ prS ]
]∈[ : ∀ {k σ} {S : Cover σ} → Σ[ S′ ∈ Cover σ ] S FromDented.∋ k ∈ S′ →
Σ[ S′ ∈ Usage σ ] ] S [ ∋ k ∈ S′
]∈[ (S , prS) = ] S [ , ] prS [
infix 6 _∈?_
_∈?_ : (k : Pr) {σ : ty} (S : Usage σ) → Con (Σ[ S′ ∈ Usage σ ] S ∋ k ∈ S′)
k ∈? [ σ ] = map [∈] $ k FromFree.∈?[ σ ]
k ∈? ] S [ = map ]∈[ $ k FromDented.∈? S
∈?-complete : (k : Pr) {σ : ty} (S : Usage σ) {T : Usage σ} (pr : S ∋ k ∈ T) →
(T , pr) BT.∈ k ∈? S
∈?-complete k [ σ ] [ pr ] = BTT.map [∈] (FromFree.∈?[]-complete k σ pr)
∈?-complete k ] S [ ] pr [ = BTT.map ]∈[ (FromDented.∈?-complete k S pr)
module Soundness where
open IMLL Pr
open Consumption Pr
open LCT.Usage
open Linearity.Type.Cover Pr
open Linearity.Type.Usage Pr
⟦][⟧ : {σ : ty} {S : Cover σ} {k : Pr} {T : Cover σ} →
Σ[ E ∈ Cover σ ] T LCT.Cover.≡ S ─ E × Cover.「 E 」 ⊢ `κ k →
Σ[ E ∈ Usage σ ] ] T [ ≡ ] S [ ─ E × Usage.「 E 」 ⊢ `κ k
⟦][⟧ (E , diff , tm) = ] E [ , ] diff [ , tm
⟦_⟧ : {σ : ty} {S : Usage σ} {k : Pr} {T : Usage σ} (pr : S ∋ k ∈ T) →
Σ[ E ∈ Usage σ ] T ≡ S ─ E × Usage.「 E 」 ⊢ `κ k
⟦ [ prS ] ⟧ = _ , inj[ _ ] , FromFree.⟦ prS ⟧
⟦ ] prS [ ⟧ = ⟦][⟧ FromDented.⟦ prS ⟧
module Context where
module SBT = Type
open IMLL.Type Pr
open Con.Context
open Linearity Pr
open Linearity.Context Pr
open Pointwise
open Con.Context.Context
infix 4 _∈_▸_
data _∈_▸_ (k : Pr) : {γ : Con ty} (Γ Δ : Usage γ) → Set where
zro : ∀ {γ σ} {Γ : Usage γ} {S S′ : LT.Usage σ} →
S Type.Usage.∋ k ∈ S′ → k ∈ Γ ∙ S ▸ Γ ∙ S′
suc : ∀ {γ τ} {Γ Γ′ : Usage γ} {T : LT.Usage τ} →
k ∈ Γ ▸ Γ′ → k ∈ Γ ∙ T ▸ Γ′ ∙ T
infix 4 _∋_∈_
_∋_∈_ : {γ : Con ty} (Γ : Usage γ) (k : Pr) (Δ : Usage γ) → Set
Γ ∋ k ∈ Δ = k ∈ Γ ▸ Δ
∈zro : ∀ {γ σ} (Γ : Usage γ) {S : LT.Usage σ} {k} →
Σ[ S′ ∈ LT.Usage σ ] S Type.Usage.∋ k ∈ S′ →
Σ[ Γ′ ∈ Usage $ γ ∙ σ ] Γ ∙ S ∋ k ∈ Γ′
∈zro Γ (S , prS) = Γ ∙ S , zro prS
∈suc : ∀ {γ σ} {Γ : Usage γ} (S : LT.Usage σ) {k} →
Σ[ Γ′ ∈ Usage γ ] Γ ∋ k ∈ Γ′ →
Σ[ Γ′ ∈ Usage $ γ ∙ σ ] Γ ∙ S ∋ k ∈ Γ′
∈suc S (Γ′ , prΓ) = Γ′ ∙ S , suc prΓ
_∈?_ : (k : Pr) {γ : Con ty} (Γ : Usage γ) → Con (Σ[ Γ′ ∈ Usage γ ] Γ ∋ k ∈ Γ′)
k ∈? ε = ε
k ∈? (Γ ∙ S) = map (∈suc S) (k ∈? Γ) ++ map (∈zro Γ) (k Type.Usage.∈? S)
where open Con.Context.Context
∈?-complete : (k : Pr) {γ : Con ty} (Γ : Usage γ) {Δ : Usage γ} (pr : Γ ∋ k ∈ Δ) →
(Δ , pr) BT.∈ k ∈? Γ
∈?-complete k ε ()
∈?-complete k (Γ ∙ S) (zro pr) = BTT.∈++ʳ (BTT.map (∈zro Γ) (Type.Usage.∈?-complete k S pr))
∈?-complete k (Γ ∙ S) (suc pr) = BTT.∈++ˡ (map (∈zro Γ) (k Type.Usage.∈? S))
(BTT.map (∈suc S) (∈?-complete k Γ pr))
module Soundness where
open IMLL Pr
open Consumption Pr
open Consumption.Context Pr
⟦zro⟧ : (γ : Con ty) (Γ : Usage γ) {σ : ty} {S S′ : LT.Usage σ} (k : Pr) →
Σ[ T ∈ LT.Usage σ ] S′ LCT.Usage.≡ S ─ T × LTU.「 T 」 ⊢ `κ k →
Σ[ E ∈ Usage $ γ ∙ σ ] Γ ∙ S′ ≡ Γ ∙ S ─ E × 「 E 」 ⊢ `κ k
⟦zro⟧ γ Γ k (T , diff , tm) =
let eq = Eq.trans (Eq.cong (flip _++_ LTU.「 T 」) 「inj[ γ ]」) $ ε++ LTU.「 T 」
in LC.inj[ γ ] ∙ T
, LCC.inj[ Γ ] ∙ diff
, Eq.subst (flip _⊢_ (`κ k)) (Eq.sym eq) tm
⟦suc⟧ : {γ : Con ty} {Γ Δ : Usage γ} (σ : ty) {S : LT.Usage σ} {k : Pr} →
Σ[ E ∈ Usage γ ] Δ ≡ Γ ─ E × 「 E 」 ⊢ `κ k →
Σ[ E ∈ Usage $ γ ∙ σ ] Δ ∙ S ≡ Γ ∙ S ─ E × 「 E 」 ⊢ `κ k
⟦suc⟧ σ (E , diff , tm) = E ∙ LT.[ σ ] , diff ∙ LCT.Usage.`idˡ , tm
⟦_⟧ : {γ : Con ty} {Γ : Usage γ} {k : Pr} {Δ : Usage γ} (pr : Γ ∋ k ∈ Δ) →
Σ[ E ∈ Usage γ ] Δ ≡ Γ ─ E × 「 E 」 ⊢ `κ k
⟦ zro x ⟧ = ⟦zro⟧ _ _ _ SBT.Usage.Soundness.⟦ x ⟧
⟦ suc pr ⟧ = ⟦suc⟧ _ ⟦ pr ⟧