Last active
November 1, 2022 14:50
-
-
Save FrozenWinters/7c333e0c7f5d6762199eebdc0736175f to your computer and use it in GitHub Desktop.
NbE for K modal logic
This file contains hidden or 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 #-} | |
| module modalNbE where | |
| open import Agda.Primitive using (Level; lzero; lsuc; _β_) | |
| open import Cubical.Foundations.Everything renaming (cong to ap) | |
| open import Cubical.Data.Sigma | |
| -- Data Structures | |
| private | |
| variable | |
| β ββ ββ ββ ββ ββ ββ : Level | |
| infixl 20 _βΉ_ | |
| data πΆπ‘π₯ (ty : Type β) : Type β where | |
| β : πΆπ‘π₯ ty | |
| _βΉ_ : πΆπ‘π₯ ty β ty β πΆπ‘π₯ ty | |
| data πππ (ty : Type β) : (Ξ : πΆπ‘π₯ ty) (A : ty) β Type β where | |
| π§π£ : {Ξ : πΆπ‘π₯ ty} {A : ty} β πππ ty (Ξ βΉ A) A | |
| π π£ : {Ξ : πΆπ‘π₯ ty} {A B : ty} β πππ ty Ξ A β πππ ty (Ξ βΉ B) A | |
| infixl 20 _β_ | |
| data πΈππ {ty : Type ββ} (el : ty β Type ββ) : (Ξ : πΆπ‘π₯ ty) β Type (ββ β ββ) where | |
| ! : πΈππ el β | |
| _β_ : {Ξ : πΆπ‘π₯ ty} {A : ty} β πΈππ el Ξ β el A β πΈππ el (Ξ βΉ A) | |
| πππ : {ty : Type ββ} (tm : πΆπ‘π₯ ty β ty β Type ββ) (Ξ Ξ : πΆπ‘π₯ ty) β Type (ββ β ββ) | |
| πππ tm Ξ Ξ = πΈππ (tm Ξ) Ξ | |
| π ππ : (ty : Type β) β πΆπ‘π₯ ty β πΆπ‘π₯ ty β Type β | |
| π ππ ty = πππ (πππ ty) | |
| mapπΆπ‘π₯ : {tyβ : Type ββ} {tyβ : Type ββ} (f : tyβ β tyβ) (Ξ : πΆπ‘π₯ tyβ) β πΆπ‘π₯ tyβ | |
| mapπΆπ‘π₯ f β = β | |
| mapπΆπ‘π₯ f (Ξ βΉ A) = mapπΆπ‘π₯ f Ξ βΉ f A | |
| mapπΈππ : {ty : Type ββ} {Ξ : πΆπ‘π₯ ty} {elβ : ty β Type ββ} {elβ : ty β Type ββ} | |
| (f : {A : ty} β elβ A β elβ A) β πΈππ elβ Ξ β πΈππ elβ Ξ | |
| mapπΈππ f ! = ! | |
| mapπΈππ f (Ο β t) = mapπΈππ f Ο β f t | |
| ΟπΈππ : {ty : Type ββ} {el : ty β Type ββ} {Ξ : πΆπ‘π₯ ty} {A : ty} β | |
| πΈππ el (Ξ βΉ A) β πΈππ el Ξ | |
| ΟπΈππ (Ο β t) = Ο | |
| π§πΈππ : {ty : Type ββ} {el : ty β Type ββ} {Ξ : πΆπ‘π₯ ty} {A : ty} β | |
| πΈππ el (Ξ βΉ A) β el A | |
| π§πΈππ (Ο β t) = t | |
| derive : {ty : Type ββ} {el : ty β Type ββ} {Ξ : πΆπ‘π₯ ty} {A : ty} β | |
| πΈππ el Ξ β πππ ty Ξ A β el A | |
| derive Ο π§π£ = π§πΈππ Ο | |
| derive Ο (π π£ v) = derive (ΟπΈππ Ο) v | |
| _βΉβΉ_ : {ty : Type β} β πΆπ‘π₯ ty β πΆπ‘π₯ ty β πΆπ‘π₯ ty | |
| Ξ βΉβΉ β = Ξ | |
| Ξ βΉβΉ (Ξ βΉ A) = (Ξ βΉβΉ Ξ) βΉ A | |
| _ββ-f_ : {ty : Type ββ} {el : ty β Type ββ} {Ξ Ξ : πΆπ‘π₯ ty} {f : ty β ty} β | |
| πΈππ el (mapπΆπ‘π₯ f Ξ) β πΈππ el (mapπΆπ‘π₯ f Ξ) β πΈππ el (mapπΆπ‘π₯ f (Ξ βΉβΉ Ξ)) | |
| _ββ-f_ {Ξ = β } Ο ! = Ο | |
| _ββ-f_ {Ξ = Ξ βΉ A} Ο (Ο β t) = (Ο ββ-f Ο) β t | |
| module _ {ty : Type β} where | |
| private | |
| ctx = πΆπ‘π₯ ty | |
| ren = π ππ ty | |
| var = πππ ty | |
| Wβπ ππ : {Ξ Ξ : ctx} (A : ty) β ren Ξ Ξ β ren (Ξ βΉ A) Ξ | |
| Wβπ ππ A = mapπΈππ π π£ | |
| Wβπ ππ : {Ξ Ξ : ctx} (A : ty) β ren Ξ Ξ β ren (Ξ βΉ A) (Ξ βΉ A) | |
| Wβπ ππ A Ο = Wβπ ππ A Ο β π§π£ | |
| idπ ππ : (Ξ : ctx) β ren Ξ Ξ | |
| idπ ππ β = ! | |
| idπ ππ (Ξ βΉ A) = Wβπ ππ A (idπ ππ Ξ) | |
| Οπ ππ : {Ξ : ctx} {A : ty} β ren (Ξ βΉ A) Ξ | |
| Οπ ππ {Ξ} {A} = ΟπΈππ (idπ ππ (Ξ βΉ A)) | |
| Οβπ ππ : (Ξ Ξ : ctx) β ren (Ξ βΉβΉ Ξ) Ξ | |
| Οβπ ππ Ξ β = idπ ππ Ξ | |
| Οβπ ππ Ξ (Ξ βΉ A) = Wβπ ππ A (Οβπ ππ Ξ Ξ) | |
| Οβπ ππ : (Ξ Ξ : ctx) β ren (Ξ βΉβΉ Ξ) Ξ | |
| Οβπ ππ Ξ β = ! | |
| Οβπ ππ Ξ (Ξ βΉ A) = Wβπ ππ A (Οβπ ππ Ξ Ξ) | |
| infix 30 _[_]π | |
| _[_]π : {Ξ Ξ : ctx} {A : ty} β var Ξ A β ren Ξ Ξ β var Ξ A | |
| v [ Ο ]π = derive Ο v | |
| infixl 30 _βπ ππ_ | |
| _βπ ππ_ : {Ξ Ξ Ξ£ : ctx} β ren Ξ Ξ£ β ren Ξ Ξ β ren Ξ Ξ£ | |
| Ο βπ ππ Ο = mapπΈππ _[ Ο ]π Ο | |
| -- Syntax | |
| infixr 20 _β_ | |
| data Ty : Type where | |
| Base : Ty | |
| _β_ : Ty β Ty β Ty | |
| β‘ : Ty β Ty | |
| Ctx = πΆπ‘π₯ Ty | |
| Var = πππ Ty | |
| Ren = π ππ Ty | |
| infixl 30 Box_With_ | |
| data Tm : Ctx β Ty β Type | |
| Tms = πππ Tm | |
| data Tm where | |
| V : {Ξ : Ctx} {A : Ty} β Var Ξ A β Tm Ξ A | |
| Lam : {Ξ : Ctx} {A B : Ty} β Tm (Ξ βΉ A) B β Tm Ξ (A β B) | |
| App : {Ξ : Ctx} {A B : Ty} β Tm Ξ (A β B) β Tm Ξ A β Tm Ξ B | |
| Box_With_ : {Ξ Ξ : Ctx} {A : Ty} β | |
| Tm Ξ A β Tms Ξ (mapπΆπ‘π₯ β‘ Ξ) β Tm Ξ (β‘ A) | |
| -- NbE | |
| data Ne : Ctx β Ty β Type | |
| data Nf : Ctx β Ty β Type | |
| Nes = πππ Ne | |
| infixl 30 BOX_WITH_ | |
| data Ne where | |
| VN : {Ξ : Ctx} {A : Ty} β Var Ξ A β Ne Ξ A | |
| APP : {Ξ : Ctx} {A B : Ty} β Ne Ξ (A β B) β Nf Ξ A β Ne Ξ B | |
| data Nf where | |
| NEU : {Ξ : Ctx} β Ne Ξ Base β Nf Ξ Base | |
| LAM : {Ξ : Ctx} {A B : Ty} β Nf (Ξ βΉ A) B β Nf Ξ (A β B) | |
| BOX_WITH_ : {Ξ Ξ : Ctx} {A : Ty} β | |
| Nf Ξ A β Nes Ξ (mapπΆπ‘π₯ β‘ Ξ) β Nf Ξ (β‘ A) | |
| infixl 20 _[_]Ne _[_]Nf | |
| {-# TERMINATING #-} | |
| _[_]Ne : {Ξ Ξ : Ctx} {A : Ty} β Ne Ξ A β Ren Ξ Ξ β Ne Ξ A | |
| _[_]Nf : {Ξ Ξ : Ctx} {A : Ty} β Nf Ξ A β Ren Ξ Ξ β Nf Ξ A | |
| VN v [ Ο ]Ne = VN (derive Ο v) | |
| APP M N [ Ο ]Ne = APP (M [ Ο ]Ne) (N [ Ο ]Nf) | |
| NEU M [ Ο ]Nf = NEU (M [ Ο ]Ne) | |
| LAM {A = A} N [ Ο ]Nf = LAM (N [ Wβπ ππ A Ο ]Nf) | |
| BOX N WITH Ο [ Ο ]Nf = BOX N WITH (mapπΈππ _[ Ο ]Ne Ο) | |
| _βNeR_ : {Ξ Ξ Ξ£ : Ctx} β Nes Ξ Ξ£ β Ren Ξ Ξ β Nes Ξ Ξ£ | |
| Ο βNeR Ο = mapπΈππ _[ Ο ]Ne Ο | |
| El : Ctx β Ty β Type | |
| El Ξ Base = Nf Ξ Base | |
| El Ξ (A β B) = {Ξ : Ctx} β Ren Ξ Ξ β El Ξ A β El Ξ B | |
| El Ξ (β‘ A) = Ξ£ Ctx (Ξ» Ξ β Nes Ξ (mapπΆπ‘π₯ β‘ Ξ) Γ El Ξ A) | |
| Els : Ctx β Ctx β Type | |
| Els Ξ Ξ = πππ El Ξ Ξ | |
| q : {Ξ : Ctx} {A : Ty} β El Ξ A β Nf Ξ A | |
| u : {Ξ : Ctx} {A : Ty} β Ne Ξ A β El Ξ A | |
| q {A = Base} N = N | |
| q {A = A β B} π» = LAM (q (π» Οπ ππ (u (VN π§π£)))) | |
| q {A = β‘ A} (Ξ , Ο , π) = BOX q π WITH Ο | |
| u {A = Base} M = NEU M | |
| u {A = A β B} M Ο π = u (APP (M [ Ο ]Ne) (q π)) | |
| u {A = β‘ A} M = (β βΉ A) , (! β M), u (VN π§π£) | |
| _[_]El : {Ξ Ξ : Ctx} {A : Ty} β El Ξ A β Ren Ξ Ξ β El Ξ A | |
| _[_]El {A = Base} N Ο = N [ Ο ]Nf | |
| _[_]El {A = A β B} π» Ο Ο π = π» (Ο βπ ππ Ο) π | |
| _[_]El {A = β‘ A} (Ξ , Ο , π) Ο = Ξ , Ο βNeR Ο , π | |
| unify : {Ξ Ξ : Ctx} β Els Ξ (mapπΆπ‘π₯ β‘ Ξ) β | |
| Ξ£ Ctx (Ξ» Ξ£ β Nes Ξ (mapπΆπ‘π₯ β‘ Ξ£) Γ Els Ξ£ Ξ) | |
| unify {Ξ = β } ! = β , ! , ! | |
| unify {Ξ = _ βΉ _} (πs β π) with unify πs | π | |
| ... | (Ξ , Ο , πs) | (Ξ , Ο , π) = | |
| (Ξ βΉβΉ Ξ) , (Ο ββ-f Ο) , (mapπΈππ _[ Οβπ ππ Ξ Ξ ]El πs) β (π [ Οβπ ππ Ξ Ξ ]El) | |
| {-# TERMINATING #-} | |
| eval : {Ξ Ξ : Ctx} {A : Ty} β Tm Ξ A β Els Ξ Ξ β El Ξ A | |
| eval (V v) πs = derive πs v | |
| eval (Lam t) πs Ο π = eval t (mapπΈππ _[ Ο ]El πs β π) | |
| eval {Ξ} (App t s) πs = eval t πs (idπ ππ Ξ) (eval s πs) | |
| eval (Box t With Ο) πs with unify (mapπΈππ (Ξ» s β eval s πs) Ο) | |
| ... | (Ξ , Ο , πs) = Ξ , Ο , eval t πs | |
| norm : {Ξ : Ctx} {A : Ty} β Tm Ξ A β Nf Ξ A | |
| norm {Ξ} t = q (eval t (mapπΈππ (u β VN) (idπ ππ Ξ))) | |
| -- Some tests | |
| {-# TERMINATING #-} | |
| ΞΉNe : {Ξ : Ctx} {A : Ty} β Ne Ξ A β Tm Ξ A | |
| ΞΉNf : {Ξ : Ctx} {A : Ty} β Nf Ξ A β Tm Ξ A | |
| ΞΉNe (VN v) = V v | |
| ΞΉNe (APP M N) = App (ΞΉNe M) (ΞΉNf N) | |
| ΞΉNf (NEU M) = ΞΉNe M | |
| ΞΉNf (LAM N) = Lam (ΞΉNf N) | |
| ΞΉNf (BOX N WITH Ο) = Box (ΞΉNf N) With mapπΈππ ΞΉNe Ο | |
| K : {Ξ : Ctx} {A B : Ty} β Tm Ξ (β‘ (A β B) β β‘ A β β‘ B) | |
| K = Lam (Lam (Box (App (V (π π£ π§π£)) (V π§π£)) With (! β V (π π£ π§π£) β V π§π£))) | |
| eg0 = K {β } {Base} {Base} | |
| val0 = ΞΉNf (norm eg0) | |
| eg1 : Tm (β βΉ β‘ (Base β Base) βΉ β‘ Base) (β‘ Base) | |
| eg1 = Box (App (V (π π£ π§π£)) (V π§π£)) With | |
| (! β V (π π£ π§π£) β Box App (V (π π£ π§π£)) (V π§π£) With (! β V (π π£ π§π£) β V π§π£)) | |
| val1 = ΞΉNf (norm eg1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment