m1-internship/ZOL.agda

293 lines
11 KiB
Agda
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{-# OPTIONS --prop --rewriting #-}
module ZOL (PV : Set) where
open import PropUtil
open import ListUtil
data Form : Set where
Var : PV Form
_⇒_ : Form Form Form
_∧∧_ : Form Form Form
: Form
infixr 10 _∧∧_
infixr 8 _⇒_
{- Contexts -}
Con = List Form
private
variable
A : Form
A' : Form
B : Form
B' : Form
C : Form
F : Form
G : Form
Γ : Con
Γ' : Con
Γ'' : Con
x : PV
{--- DEFINITION OF ⊢ ---}
data _⊢_ : Con Form Prop where
zero : A Γ Γ A
lam : (A Γ) B Γ (A B)
app : Γ (A B) Γ A Γ B
andi : Γ A Γ B Γ A ∧∧ B
ande₁ : Γ A ∧∧ B Γ A
ande₂ : Γ A ∧∧ B Γ B
true : Γ
infix 5 _⊢_
zero⊢ : (A Γ) A
zero⊢ = zero zero∈
one⊢ : (B A Γ) A
one⊢ = zero (next∈ zero∈)
-- We can add hypotheses to a proof
addhyp⊢ : Γ ∈* Γ' Γ A Γ' A
addhyp⊢ s (zero x) = zero (mon∈∈* x s)
addhyp⊢ s (lam h) = lam (addhyp⊢ (both∈* s) h)
addhyp⊢ s (app h h₁) = app (addhyp⊢ s h) (addhyp⊢ s h₁)
addhyp⊢ s (andi h₁ h₂) = andi (addhyp⊢ s h₁) (addhyp⊢ s h₂)
addhyp⊢ s (ande₁ h) = ande₁ (addhyp⊢ s h)
addhyp⊢ s (ande₂ h) = ande₂ (addhyp⊢ s h)
addhyp⊢ s (true) = true
-- Extension of ⊢ to contexts
_⊢⁺_ : Con Con Prop
Γ ⊢⁺ [] =
Γ ⊢⁺ (F Γ') = (Γ F) (Γ ⊢⁺ Γ')
infix 5 _⊢⁺_
-- We show that the relation respects ∈*
mon∈*⊢⁺ : Γ' ∈* Γ Γ ⊢⁺ Γ'
mon∈*⊢⁺ zero∈* = tt
mon∈*⊢⁺ (next∈* x h) = (zero x) , (mon∈*⊢⁺ h)
-- The relation respects ⊆
mon⊆⊢⁺ : Γ' Γ Γ ⊢⁺ Γ'
mon⊆⊢⁺ h = mon∈*⊢⁺ (⊆→∈* h)
-- The relation is reflexive
refl⊢⁺ : Γ ⊢⁺ Γ
refl⊢⁺ {[]} = tt
refl⊢⁺ {x Γ} = zero⊢ , mon⊆⊢⁺ (next⊆ zero⊆)
-- We can add hypotheses to to a proof
addhyp⊢⁺ : Γ ∈* Γ' Γ ⊢⁺ Γ'' Γ' ⊢⁺ Γ''
addhyp⊢⁺ {Γ'' = []} s h = tt
addhyp⊢⁺ {Γ'' = x Γ''} s Γx , ΓΓ'' = addhyp⊢ s Γx , addhyp⊢⁺ s ΓΓ''
-- The relation respects ⊢
halftran⊢⁺ : {Γ Γ' : Con} {F : Form} Γ ⊢⁺ Γ' Γ' F Γ F
halftran⊢⁺ {Γ' = F Γ'} h⁺ (zero zero∈) = proj₁ h⁺
halftran⊢⁺ {Γ' = F Γ'} h⁺ (zero (next∈ x)) = halftran⊢⁺ (proj₂ h⁺) (zero x)
halftran⊢⁺ h⁺ (lam h) = lam (halftran⊢⁺ (zero zero∈) , (addhyp⊢⁺ (right∈* refl∈*) h⁺) h)
halftran⊢⁺ h⁺ (app h h₁) = app (halftran⊢⁺ h⁺ h) (halftran⊢⁺ h⁺ h₁)
halftran⊢⁺ h⁺ (andi hf hg) = andi (halftran⊢⁺ h⁺ hf) (halftran⊢⁺ h⁺ hg)
halftran⊢⁺ h⁺ (ande₁ hfg) = ande₁ (halftran⊢⁺ h⁺ hfg)
halftran⊢⁺ h⁺ (ande₂ hfg) = ande₂ (halftran⊢⁺ h⁺ hfg)
halftran⊢⁺ h⁺ (true) = true
-- The relation is transitive
tran⊢⁺ : {Γ Γ' Γ'' : Con} Γ ⊢⁺ Γ' Γ' ⊢⁺ Γ'' Γ ⊢⁺ Γ''
tran⊢⁺ {Γ'' = []} h h' = tt
tran⊢⁺ {Γ'' = x Γ*} h h' = halftran⊢⁺ h (proj₁ h') , tran⊢⁺ h (proj₂ h')
{--- DEFINITIONS OF ⊢⁰ and ⊢* ---}
-- ⊢⁰ are neutral forms
-- ⊢* are normal forms
mutual
data _⊢⁰_ : Con Form Prop where
zero : A Γ Γ ⊢⁰ A
app : Γ ⊢⁰ (A B) Γ ⊢* A Γ ⊢⁰ B
ande₁ : Γ ⊢⁰ A ∧∧ B Γ ⊢⁰ A
ande₂ : Γ ⊢⁰ A ∧∧ B Γ ⊢⁰ B
data _⊢*_ : Con Form Prop where
neu⁰ : Γ ⊢⁰ Var x Γ ⊢* Var x
lam : (A Γ) ⊢* B Γ ⊢* (A B)
andi : Γ ⊢* A Γ ⊢* B Γ ⊢* (A ∧∧ B)
true : Γ ⊢*
infix 5 _⊢⁰_
infix 5 _⊢*_
-- Both are tighter than ⊢
⊢⁰→⊢ : Γ ⊢⁰ F Γ F
⊢*→⊢ : Γ ⊢* F Γ F
⊢⁰→⊢ (zero h) = zero h
⊢⁰→⊢ (app h x) = app (⊢⁰→⊢ h) (⊢*→⊢ x)
⊢⁰→⊢ (ande₁ h) = ande₁ (⊢⁰→⊢ h)
⊢⁰→⊢ (ande₂ h) = ande₂ (⊢⁰→⊢ h)
⊢*→⊢ (neu⁰ x) = ⊢⁰→⊢ x
⊢*→⊢ (lam h) = lam (⊢*→⊢ h)
⊢*→⊢ (andi h₁ h₂) = andi (⊢*→⊢ h₁) (⊢*→⊢ h₂)
⊢*→⊢ true = true
-- We can add hypotheses to a proof
addhyp⊢⁰ : Γ ∈* Γ' Γ ⊢⁰ A Γ' ⊢⁰ A
addhyp⊢* : Γ ∈* Γ' Γ ⊢* A Γ' ⊢* A
addhyp⊢⁰ s (zero x) = zero (mon∈∈* x s)
addhyp⊢⁰ s (app h h₁) = app (addhyp⊢⁰ s h) (addhyp⊢* s h₁)
addhyp⊢⁰ s (ande₁ h) = ande₁ (addhyp⊢⁰ s h)
addhyp⊢⁰ s (ande₂ h) = ande₂ (addhyp⊢⁰ s h)
addhyp⊢* s (neu⁰ x) = neu⁰ (addhyp⊢⁰ s x)
addhyp⊢* s (lam h) = lam (addhyp⊢* (both∈* s) h)
addhyp⊢* s (andi h₁ h₂) = andi (addhyp⊢* s h₁) (addhyp⊢* s h₂)
addhyp⊢* s true = true
-- Extension of ⊢⁰ to contexts
-- i.e. there is a neutral proof for any element
_⊢⁰⁺_ : Con Con Prop
Γ ⊢⁰⁺ [] =
Γ ⊢⁰⁺ (F Γ') = (Γ ⊢⁰ F) (Γ ⊢⁰⁺ Γ')
infix 5 _⊢⁰⁺_
-- The relation respects ∈*
mon∈*⊢⁰⁺ : Γ' ∈* Γ Γ ⊢⁰⁺ Γ'
mon∈*⊢⁰⁺ zero∈* = tt
mon∈*⊢⁰⁺ (next∈* x h) = (zero x) , (mon∈*⊢⁰⁺ h)
-- The relation respects ⊆
mon⊆⊢⁰⁺ : Γ' Γ Γ ⊢⁰⁺ Γ'
mon⊆⊢⁰⁺ h = mon∈*⊢⁰⁺ (⊆→∈* h)
-- This relation is reflexive
refl⊢⁰⁺ : Γ ⊢⁰⁺ Γ
refl⊢⁰⁺ {[]} = tt
refl⊢⁰⁺ {x Γ} = zero zero∈ , mon⊆⊢⁰⁺ (next⊆ zero⊆)
-- A useful lemma, that we can add hypotheses
addhyp⊢⁰⁺ : Γ ∈* Γ' Γ ⊢⁰⁺ Γ'' Γ' ⊢⁰⁺ Γ''
addhyp⊢⁰⁺ {Γ'' = []} s h = tt
addhyp⊢⁰⁺ {Γ'' = A Γ'} s Γx , ΓΓ'' = addhyp⊢⁰ s Γx , addhyp⊢⁰⁺ s ΓΓ''
-- The relation preserves ⊢⁰ and ⊢*
halftran⊢⁰⁺* : {Γ Γ' : Con} {F : Form} Γ ⊢⁰⁺ Γ' Γ' ⊢* F Γ ⊢* F
halftran⊢⁰⁺⁰ : {Γ Γ' : Con} {F : Form} Γ ⊢⁰⁺ Γ' Γ' ⊢⁰ F Γ ⊢⁰ F
halftran⊢⁰⁺* h⁺ (neu⁰ x) = neu⁰ (halftran⊢⁰⁺⁰ h⁺ x)
halftran⊢⁰⁺* h⁺ (lam h) = lam (halftran⊢⁰⁺* zero zero∈ , addhyp⊢⁰⁺ (right∈* refl∈*) h⁺ h)
halftran⊢⁰⁺* h⁺ (andi h₁ h₂) = andi (halftran⊢⁰⁺* h⁺ h₁) (halftran⊢⁰⁺* h⁺ h₂)
halftran⊢⁰⁺* h⁺ true = true
halftran⊢⁰⁺⁰ {Γ' = x Γ'} h⁺ (zero zero∈) = proj₁ h⁺
halftran⊢⁰⁺⁰ {Γ' = x Γ'} h⁺ (zero (next∈ h)) = halftran⊢⁰⁺⁰ (proj₂ h⁺) (zero h)
halftran⊢⁰⁺⁰ h⁺ (app h h') = app (halftran⊢⁰⁺⁰ h⁺ h) (halftran⊢⁰⁺* h⁺ h')
halftran⊢⁰⁺⁰ h⁺ (ande₁ h) = ande₁ (halftran⊢⁰⁺⁰ h⁺ h)
halftran⊢⁰⁺⁰ h⁺ (ande₂ h) = ande₂ (halftran⊢⁰⁺⁰ h⁺ h)
-- The relation is transitive
tran⊢⁰⁺ : {Γ Γ' Γ'' : Con} Γ ⊢⁰⁺ Γ' Γ' ⊢⁰⁺ Γ'' Γ ⊢⁰⁺ Γ''
tran⊢⁰⁺ {Γ'' = []} h h' = tt
tran⊢⁰⁺ {Γ'' = x Γ} h h' = halftran⊢⁰⁺⁰ h (proj₁ h') , tran⊢⁰⁺ h (proj₂ h')
{--- Simple translation with in an Environment ---}
Env = PV Prop
⟦_⟧ᶠ : Form Env Prop
Var x ⟧ᶠ ρ = ρ x
A B ⟧ᶠ ρ = ( A ⟧ᶠ ρ) ( B ⟧ᶠ ρ)
A ∧∧ B ⟧ᶠ ρ = ( A ⟧ᶠ ρ) ( B ⟧ᶠ ρ)
⟧ᶠ ρ =
⟦_⟧ᶜ : Con Env Prop
[] ⟧ᶜ ρ =
A Γ ⟧ᶜ ρ = ( A ⟧ᶠ ρ) ( Γ ⟧ᶜ ρ)
⟦_⟧ᵈ : Γ A {ρ : Env} Γ ⟧ᶜ ρ A ⟧ᶠ ρ
⟦_⟧ᵈ {x Γ} (zero zero∈) p = proj₁ p
⟦_⟧ᵈ {x Γ} (zero (next∈ h)) p = zero h ⟧ᵈ (proj₂ p)
lam th ⟧ᵈ = λ pₐ p₀ th ⟧ᵈ p₀ , pₐ
app th₁ th₂ ⟧ᵈ = λ p th₁ ⟧ᵈ p ( th₂ ⟧ᵈ p)
andi hf hg ⟧ᵈ = λ p hf ⟧ᵈ p , hg ⟧ᵈ p
ande₁ hfg ⟧ᵈ = λ p proj₁ ( hfg ⟧ᵈ p)
ande₂ hfg ⟧ᵈ = λ p proj₂ ( hfg ⟧ᵈ p)
true ⟧ᵈ ρ = tt
{--- Combinatory Logic ---}
data ⊢sk : Form Prop where
SS : ⊢sk ((A B C) (A B) A C)
KK : ⊢sk (A B A)
ANDi : ⊢sk (A B (A ∧∧ B))
ANDe₁ : ⊢sk ((A ∧∧ B) A)
ANDe₂ : ⊢sk ((A ∧∧ B) B)
app : ⊢sk (A B) ⊢sk A ⊢sk B
true : ⊢sk
data _⊢skC_ : Con Form Prop where
zero : A Γ Γ ⊢skC A
SS : Γ ⊢skC ((A B C) (A B) A C)
KK : Γ ⊢skC (A B A)
ANDi : Γ ⊢skC (A B (A ∧∧ B))
ANDe₁ : Γ ⊢skC ((A ∧∧ B) A)
ANDe₂ : Γ ⊢skC ((A ∧∧ B) B)
app : Γ ⊢skC (A B) Γ ⊢skC A Γ ⊢skC B
true : Γ ⊢skC
-- combinatory gives the same proofs as classic
⊢⇔⊢sk : ([] A) ⊢sk A
⊢sk→⊢ : ⊢sk A ([] A)
⊢sk→⊢ SS = lam (lam (lam ( app (app (zero $ next∈ $ next∈ zero∈) (zero zero∈)) (app (zero $ next∈ $ zero∈) (zero zero∈)))))
⊢sk→⊢ KK = lam (lam (zero $ next∈ $ zero∈))
⊢sk→⊢ ANDi = lam (lam (andi (zero $ next∈ $ zero∈) (zero zero∈)))
⊢sk→⊢ ANDe₁ = lam (ande₁ (zero zero∈))
⊢sk→⊢ ANDe₂ = lam (ande₂ (zero zero∈))
⊢sk→⊢ (app x x₁) = app (⊢sk→⊢ x) (⊢sk→⊢ x₁)
⊢sk→⊢ true = true
skC→sk : [] ⊢skC A ⊢sk A
skC→sk SS = SS
skC→sk KK = KK
skC→sk ANDi = ANDi
skC→sk ANDe₁ = ANDe₁
skC→sk ANDe₂ = ANDe₂
skC→sk (app d e) = app (skC→sk d) (skC→sk e)
skC→sk true = true
lam-sk : (A Γ) ⊢skC B Γ ⊢skC (A B)
lam-sk-zero : Γ ⊢skC (A A)
lam-sk-zero {A = A} = app (app SS KK) (KK {B = A})
lam-sk (zero zero∈) = lam-sk-zero
lam-sk (zero (next∈ h)) = app KK (zero h)
lam-sk SS = app KK SS
lam-sk KK = app KK KK
lam-sk ANDi = app KK (app (app SS (app (app SS (app KK SS)) (app (app SS (app KK KK)) (app (app SS (app KK ANDi)) (lam-sk-zero))))) (app KK lam-sk-zero))
lam-sk ANDe₁ = app KK (app (app SS (app KK ANDe₁)) lam-sk-zero)
lam-sk ANDe₂ = app KK (app (app SS (app KK ANDe₂)) lam-sk-zero)
lam-sk (app x₁ x₂) = app (app SS (lam-sk x₁)) (lam-sk x₂)
lam-sk true = app KK true
⊢→⊢skC : Γ A Γ ⊢skC A
⊢→⊢skC (zero h) = zero h
⊢→⊢skC (lam x) = lam-sk (⊢→⊢skC x)
⊢→⊢skC (app x x₁) = app (⊢→⊢skC x) (⊢→⊢skC x₁)
⊢→⊢skC (andi x y) = app (app ANDi (⊢→⊢skC x)) (⊢→⊢skC y)
⊢→⊢skC (ande₁ x) = app ANDe₁ (⊢→⊢skC x)
⊢→⊢skC (ande₂ x) = app ANDe₂ (⊢→⊢skC x)
⊢→⊢skC (true) = true
⊢⇔⊢sk = (λ x skC→sk (⊢→⊢skC x)) , ⊢sk→⊢