Stable and DeBruijn
This commit is contained in:
parent
2a45baba90
commit
f6f41167ba
2 changed files with 133 additions and 0 deletions
59
src/extra/DeBruijn.lagda
Normal file
59
src/extra/DeBruijn.lagda
Normal file
|
@ -0,0 +1,59 @@
|
|||
## DeBruijn encodings in Agda
|
||||
|
||||
\begin{code}
|
||||
module DeBruijn where
|
||||
\end{code}
|
||||
|
||||
## Imports
|
||||
|
||||
\begin{code}
|
||||
import Relation.Binary.PropositionalEquality as Eq
|
||||
open Eq using (_≡_; refl; sym; trans; cong)
|
||||
open Eq.≡-Reasoning
|
||||
open import Data.Nat using (ℕ; zero; suc)
|
||||
open import Data.Product using (_×_; proj₁; proj₂) renaming (_,_ to ⟨_,_⟩)
|
||||
open import Data.Sum using (_⊎_; inj₁; inj₂)
|
||||
open import Relation.Nullary using (¬_)
|
||||
open import Relation.Nullary.Negation using (contraposition)
|
||||
open import Data.Unit using (⊤; tt)
|
||||
open import Data.Empty using (⊥; ⊥-elim)
|
||||
open import Function using (_∘_)
|
||||
\end{code}
|
||||
|
||||
## Representation
|
||||
|
||||
\begin{code}
|
||||
data Type : Set where
|
||||
`ℕ : Type
|
||||
_`→_ : Type → Type → Type
|
||||
|
||||
data Env : Set where
|
||||
ε : Env
|
||||
_,_ : Env → Type → Env
|
||||
|
||||
data Var : Env → Type → Set where
|
||||
zero : ∀ {Γ : Env} {A : Type} → Var (Γ , A) A
|
||||
suc : ∀ {Γ : Env} {A B : Type} → Var Γ B → Var (Γ , A) B
|
||||
|
||||
data Exp : Env → Type → Set where
|
||||
var : ∀ {Γ : Env} {A : Type} → Var Γ A → Exp Γ A
|
||||
abs : ∀ {Γ : Env} {A B : Type} → Exp (Γ , A) B → Exp Γ (A `→ B)
|
||||
app : ∀ {Γ : Env} {A B : Type} → Exp Γ (A `→ B) → Exp Γ A → Exp Γ B
|
||||
|
||||
type : Type → Set
|
||||
type `ℕ = ℕ
|
||||
type (A `→ B) = type A → type B
|
||||
|
||||
env : Env → Set
|
||||
env ε = ⊤
|
||||
env (Γ , A) = env Γ × type A
|
||||
|
||||
lookup : ∀ {Γ : Env} {A : Type} → Var Γ A → env Γ → type A
|
||||
lookup zero ⟨ ρ , v ⟩ = v
|
||||
lookup (suc n) ⟨ ρ , v ⟩ = lookup n ρ
|
||||
|
||||
eval : ∀ {Γ : Env} {A : Type} → Exp Γ A → env Γ → type A
|
||||
eval (var n) ρ = lookup n ρ
|
||||
eval (abs N) ρ = λ{ v → eval N ⟨ ρ , v ⟩ }
|
||||
eval (app L M) ρ = eval L ρ (eval M ρ)
|
||||
\end{code}
|
74
src/extra/Stable.agda
Normal file
74
src/extra/Stable.agda
Normal file
|
@ -0,0 +1,74 @@
|
|||
import Relation.Binary.PropositionalEquality as Eq
|
||||
open Eq using (_≡_; refl; sym; trans; cong)
|
||||
open Eq.≡-Reasoning
|
||||
open import Data.Nat using (ℕ; zero; suc)
|
||||
open import Data.Product using (_×_; proj₁; proj₂) renaming (_,_ to ⟨_,_⟩)
|
||||
open import Data.Sum using (_⊎_; inj₁; inj₂)
|
||||
open import Relation.Nullary using (¬_)
|
||||
open import Relation.Nullary.Negation using (contraposition)
|
||||
open import Data.Unit using (⊤; tt)
|
||||
open import Data.Empty using (⊥; ⊥-elim)
|
||||
open import Data.List using (List; []; _∷_; foldr; map)
|
||||
open import Function using (_∘_)
|
||||
|
||||
double-negation : ∀ {A : Set} → A → ¬ ¬ A
|
||||
double-negation x ¬x = ¬x x
|
||||
|
||||
triple-negation : ∀ {A : Set} → ¬ ¬ ¬ A → ¬ A
|
||||
triple-negation ¬¬¬x x = ¬¬¬x (double-negation x)
|
||||
|
||||
Stable : Set → Set
|
||||
Stable A = ¬ ¬ A → A
|
||||
|
||||
¬-stable : ∀ {A : Set} → Stable (¬ A)
|
||||
¬-stable = triple-negation
|
||||
|
||||
×-stable : ∀ {A B : Set} → Stable A → Stable B → Stable (A × B)
|
||||
×-stable ¬¬x→x ¬¬y→y ¬¬xy =
|
||||
⟨ ¬¬x→x (contraposition (contraposition proj₁) ¬¬xy)
|
||||
, ¬¬y→y (contraposition (contraposition proj₂) ¬¬xy)
|
||||
⟩
|
||||
|
||||
∀-stable : ∀ {A : Set} {B : A → Set} → (∀ (x : A) → Stable (B x)) → Stable (∀ (x : A) → B x)
|
||||
∀-stable ∀x→¬¬y→y ¬¬∀x→y x =
|
||||
∀x→¬¬y→y x (contraposition (contraposition λ{∀x→y → ∀x→y x}) ¬¬∀x→y)
|
||||
|
||||
-- Gödel-Gentzen translation
|
||||
|
||||
{--
|
||||
data Var : ℕ → Set where
|
||||
zero : ∀ (n : ℕ) → Var (suc n)
|
||||
suc : ∀ (n : ℕ) → Var n → Var (suc n)
|
||||
|
||||
data Formula : ℕ → Set where
|
||||
_`≡_ : ∀ (n : ℕ) → Var n → Var n → Formula n
|
||||
_`×_ : ∀ (n : ℕ) → Formula n → Formula n → Formula n
|
||||
_`⊎_ : ∀ (n : ℕ) → Formula n → Formula n → Formula n
|
||||
`¬_ : ∀ (n : ℕ) → Formula n → Formula n
|
||||
--}
|
||||
|
||||
data Formula : Set₁ where
|
||||
atomic : ∀ (A : Set) → Formula
|
||||
_`×_ : Formula → Formula → Formula
|
||||
_`⊎_ : Formula → Formula → Formula
|
||||
`¬_ : Formula → Formula
|
||||
|
||||
interp : Formula → Set
|
||||
interp (atomic A) = A
|
||||
interp (`A `× `B) = interp `A × interp `B
|
||||
interp (`A `⊎ `B) = interp `A ⊎ interp `B
|
||||
interp (`¬ `A) = ¬ interp `A
|
||||
|
||||
g : Formula → Formula
|
||||
g (atomic A) = `¬ `¬ (atomic A)
|
||||
g (`A `× `B) = g `A `× g `B
|
||||
g (`A `⊎ `B) = `¬ ((`¬ g `A) `× (`¬ g `B))
|
||||
g (`¬ `A) = `¬ g `A
|
||||
|
||||
stable-g : ∀ (`A : Formula) → Stable (interp (g `A))
|
||||
stable-g (atomic A) = ¬-stable
|
||||
stable-g (`A `× `B) = ×-stable (stable-g `A) (stable-g `B)
|
||||
stable-g (`A `⊎ `B) = ¬-stable
|
||||
stable-g (`¬ `A) = ¬-stable
|
||||
|
||||
|
Loading…
Reference in a new issue