Created
May 11, 2022 17:59
-
-
Save FrozenWinters/4f79bde2facd543170f919db6200ac24 to your computer and use it in GitHub Desktop.
Untyped lambda calculus syntax with explicit substitutions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# OPTIONS --cubical --guardedness #-} | |
module untyped-lambda where | |
open import Agda.Primitive using (Level; lzero; lsuc; _β_) public | |
open import Cubical.Core.Everything public | |
open import Cubical.Foundations.Everything renaming (cong to ap) public | |
open import Cubical.Data.Nat renaming (zero to Z ; suc to S) | |
-- Construction of untyped lambda-calculus syntax | |
infixl 10 _β_ | |
data πΈππ (el : Type) : β β Type where | |
! : πΈππ el Z | |
_β_ : {n : β} β πΈππ el n β el β πΈππ el (S n) | |
mapπΈππ : {elβ elβ : Type} (f : elβ β elβ) {n : β} β πΈππ elβ n β πΈππ elβ n | |
mapπΈππ f ! = ! | |
mapπΈππ f (Ο β t) = mapπΈππ f Ο β f t | |
ΟπΈππ : {el : Type} {n : β} β πΈππ el (S n) β πΈππ el n | |
ΟπΈππ (Ο β t) = Ο | |
πππ : (tm : β β Type) β β β β β Type | |
πππ tm n m = πΈππ (tm n) m | |
data Fin : (n : β) β Type where | |
π : {n : β} β Fin (S n) | |
π : {n : β} β Fin n β Fin (S n) | |
Ren = πππ Fin | |
WβRen : {n m : β} β Ren n m β Ren (S n) m | |
WβRen Ο = mapπΈππ π Ο | |
WβRen : {n m : β} β Ren n m β Ren (S n) (S m) | |
WβRen Ο = WβRen Ο β π | |
idRen : (n : β) β Ren n n | |
idRen Z = ! | |
idRen (S n) = WβRen (idRen n) | |
ΟRen : {n : β} β Ren (S n) n | |
ΟRen {n} = ΟπΈππ (idRen (S n)) | |
derive : {el : Type} {n : β} β πΈππ el n β Fin n β el | |
derive (Ο β t) π = t | |
derive (Ο β t) (π n) = derive Ο n | |
deriveRen : {el : Type} {n m : β} β πΈππ el n β Ren n m β πΈππ el m | |
deriveRen Ο Ο = mapπΈππ (derive Ο) Ο | |
data Tm : (n : β) β Type | |
Tms = πππ Tm | |
_βTms_ : {n m k : β} β Tms m k β Tms n m β Tms n k | |
idTms : (n : β) β Tms n n | |
WβTm : {n : β} β Tm n β Tm (S n) | |
WβTms : {n m : β} β Tms n m β Tms (S n) m | |
WβTms : {n m : β} β Tms n m β Tms (S n) (S m) | |
infixl 20 _[_] | |
data Tm where | |
V : {n : β} β Fin n β Tm n | |
Lam : {n : β} β Tm (S n) β Tm n | |
App : {n : β} β Tm n β Tm n β Tm n | |
_[_] : {n m : β} β Tm m β Tms n m β Tm n | |
Ξ² : {n : β} (t : Tm (S n)) (s : Tm n) β App (Lam t) s β‘ t [ idTms n β s ] | |
Ξ· : {n : β} (t : Tm n) β t β‘ Lam (App (WβTm t) (V π)) | |
V[] : {n m : β} (v : Fin m) (Ο : Tms n m) β V v [ Ο ] β‘ derive Ο v | |
Lam[] : {n m : β} (t : Tm (S m)) (Ο : Tms n m) β Lam t [ Ο ] β‘ Lam (t [ WβTms Ο ]) | |
App[] : {n m : β} (t s : Tm m) (Ο : Tms n m) β App t s [ Ο ] β‘ App (t [ Ο ]) (s [ Ο ]) | |
[][] : {n m k : β} (t : Tm k) (Ο : Tms m k) (Ο : Tms n m) β t [ Ο ] [ Ο ] β‘ t [ Ο βTms Ο ] | |
trunc : {n : β} β isSet (Tm n) | |
Ο βTms Ο = mapπΈππ _[ Ο ] Ο | |
varify : {n m : β} β Ren n m β Tms n m | |
varify Ο = mapπΈππ V Ο | |
idTms n = varify (idRen n) | |
WβTm t = t [ varify ΟRen ] | |
WβTms Ο = mapπΈππ WβTm Ο | |
WβTms Ο = WβTms Ο β V π |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment