open import Data.Product hiding (map)
open import Data.Nat
open import Function
open import lib.Context as Con
open Context
open import lib.Maybe
open import lib.Nullary
open import Relation.Nullary
open import Relation.Binary.PropositionalEquality as Eq using (_≡_)
module lps.IMLL (Pr : Set) where
module Type where
infixl 40 _`⊗_ _`&_
data ty : Set where
`κ : (k : Pr) → ty
_`⊗_ _`&_ : (A B : ty) → ty
open Type
open BelongsTo
open Interleaving
split-⊗ : ∀ {Γ σ τ} (pr : σ `⊗ τ ∈ Γ) → Con ty
split-⊗ {Γ} {σ} {τ} pr = have const split actUpon Γ at pr
where split = ε ∙ σ ∙ τ
split-&₁ : ∀ {Γ σ τ} (pr : σ `& τ ∈ Γ) → Con ty
split-&₁ {Γ} {σ} {τ} pr = have const split actUpon Γ at pr
where split = ε ∙ σ
split-&₂ : ∀ {Γ σ τ} (pr : σ `& τ ∈ Γ) → Con ty
split-&₂ {Γ} {σ} {τ} pr = have const split actUpon Γ at pr
where split = ε ∙ τ
infix 3 _⊢_
data _⊢_ : (Γ : Con ty) (σ : ty) → Set where
`v : ∀ {τ} → ε ∙ τ ⊢ τ
_`⊗ˡ_ : ∀ {Γ σ τ₁ τ₂} (pr : τ₁ `⊗ τ₂ ∈ Γ) (s : split-⊗ pr ⊢ σ) → Γ ⊢ σ
_`&ˡ₁_ : ∀ {Γ σ τ₁ τ₂} (pr : τ₁ `& τ₂ ∈ Γ) (s : split-&₁ pr ⊢ σ) → Γ ⊢ σ
_`&ˡ₂_ : ∀ {Γ σ τ₁ τ₂} (pr : τ₁ `& τ₂ ∈ Γ) (s : split-&₂ pr ⊢ σ) → Γ ⊢ σ
_`⊗ʳ_by_ : ∀ {Γ Δ E σ τ} (s : Δ ⊢ σ) (t : E ⊢ τ) (pr : Γ ≡ Δ ⋈ E) → Γ ⊢ σ `⊗ τ
_`&ʳ_ : ∀ {Γ σ τ} (s : Γ ⊢ σ) (t : Γ ⊢ τ) → Γ ⊢ σ `& τ
module Examples where
example& : (A : ty) → ε ∙ A ⊢ A `& A
example& A = `v `&ʳ `v
example⊗ : (A : ty) → ε ∙ A `⊗ A ⊢ A `⊗ A
example⊗ A = zro `⊗ˡ (`v `⊗ʳ `v by (ε ∙ʳ A ∙ˡ A))
module RewriteRules where
open Context.Context
tm-assoc : (Γ Δ E : Con ty) {σ : ty} (tm : (Γ ++ Δ) ++ E ⊢ σ) →
Γ ++ (Δ ++ E) ⊢ σ
tm-assoc Γ Δ E {σ} = Eq.subst (flip _⊢_ σ) $ assoc++ Γ Δ E
tm-assoc⁻¹ : (Γ Δ E : Con ty) {σ : ty} (tm : Γ ++ (Δ ++ E) ⊢ σ) →
(Γ ++ Δ) ++ E ⊢ σ
tm-assoc⁻¹ Γ Δ E {σ} = Eq.subst (flip _⊢_ σ) $ Eq.sym $ assoc++ Γ Δ E
tm-group : (Γ Δ E F : Con ty) {σ : ty} (tm : Γ ++ Δ ++ E ++ F ⊢ σ) →
Γ ++ (Δ ++ E) ++ F ⊢ σ
tm-group Γ Δ E F {σ} = Eq.subst (λ D → D ++ F ⊢ σ) $ assoc++ Γ Δ E