summaryrefslogtreecommitdiff
path: root/src/Problem21.agda
blob: e5d27e2cc8f9b7e3c3ec3990b64c04c0f2a48933 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
{-# OPTIONS --safe #-}

module Problem21 (Atom : Set) where

open import Data.List
open import Relation.Binary.PropositionalEquality hiding ([_])
open import Data.Empty
open import Data.Nat
open import Data.Fin
open import Data.Fin.Patterns
open import Data.Product

data L : Set where
    ⟨_⟩ : Atom → L
    ⟨_⟩ᶜ : Atom → L
    _⊗_ : L → L → L
    _⅋_ : L → L → L
    ⊥' : L
    𝟙  : L

variable A B C : L
variable Δ Γ : List L
variable α β η : Atom

_ᶜ : L → L
⟨ A ⟩   ᶜ = ⟨ A ⟩ᶜ
⟨ A ⟩ᶜ  ᶜ = ⟨ A ⟩
(A ⊗ B) ᶜ = (A ᶜ) ⅋ (B ᶜ)
(A ⅋ B) ᶜ = (A ᶜ) ⊗ (B ᶜ)
𝟙       ᶜ = ⊥'
⊥'      ᶜ = 𝟙

_⊸_ : L → L → L
A ⊸ B = (A ᶜ) ⅋ B

infixl 2 ⊢_
data ⊢_ : List L → Set where
    one      : ⊢ [ 𝟙 ]
    identity : ⊢ ⟨ α ⟩ ∷ ⟨ α ⟩ᶜ ∷ []
    exch     :  (n : Fin (length Δ))
             → ⊢ lookup Δ n ∷ (Δ ─ n)
             → ⊢ Δ
    times    : (n : ℕ)
             → ⊢ A ∷ take n Δ
             → ⊢ B ∷ drop n Δ
             → ⊢ A ⊗ B ∷ Δ
    par      : ⊢ A ∷ B ∷ Δ
             → ⊢ A ⅋ B ∷ Δ
    bottom   : ⊢ Δ
             → ⊢ ⊥' ∷ Δ

    cut      : ⊢ A ∷ Δ
             → ⊢ A ᶜ ∷ Γ
             → ⊢ Δ ++ Γ

id : {A : L} → ⊢ A ∷ A ᶜ ∷ []
id {⟨ x ⟩} = identity
id {⟨ x ⟩ᶜ} = exch 1F identity
id {A ⊗ B} = exch 1F (par (exch 2F (times 1 (id {A}) (id {B}))))
id {A ⅋ B} = par (exch 2F (times 1 (exch 1F (id {A})) (exch 1F (id {B}))))
id {⊥'} = bottom one
id {𝟙} = exch 1F (bottom one)

id′ : {A : L} → ⊢ A ᶜ ∷ A ∷ []
id′ = exch 1F id

_≈_ : L → L → Set
A ≈ B = (⊢ [ A ] → ⊢ [ B ]) × (⊢ [ B ] → ⊢ [ A ])

lem₁ : ((A ⊗ B) ⊸ C) ≈ (A ⊸ (B ⊸ C))
lem₁ .proj₁ prf = cut prf (exch 1F (par (exch 1F (par (exch 2F (exch 3F (times 2 (times 1 id′ id′) id′)))))))
lem₁ .proj₂ prf = cut prf (exch 1F (par (par (exch 3F (times 1 id′ (times 1 id′ id′))))))

lem₂ : (A ⊸ (B ⅋ C)) ≈ ((A ⊸ B) ⅋ C)
lem₂ .proj₁ prf = cut prf (exch 1F (par (par (exch 3F (times 1 id′ (times 1 id′ id′))))))
lem₂ .proj₂ prf = cut prf (exch 1F (par (exch 1F (par (exch 2F (exch 3F (times 2 (times 1 id′ id′) id′)))))))

lem₃ : (A ⊸ B) ≈ ((B ᶜ) ⊸ (A ᶜ))
lem₃ .proj₁ prf = cut prf (exch 1F (par (exch 1F (exch 2F (times 1 id′ id)))))
lem₃ .proj₂ prf = cut prf (exch 1F (par (exch 1F (exch 2F (times 1 (exch 1F (cut id′ id)) id′)))))