From df1a8c00fa29460dc3a683442048147626ac11a9 Mon Sep 17 00:00:00 2001 From: Eric Giovannini <ecg19@seas.upenn.edu> Date: Tue, 11 Oct 2022 15:26:54 -0400 Subject: [PATCH] Syntax of gradual CBV cast calculus --- .../guarded-cubical/GradualSTLC.agda | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 formalizations/guarded-cubical/GradualSTLC.agda diff --git a/formalizations/guarded-cubical/GradualSTLC.agda b/formalizations/guarded-cubical/GradualSTLC.agda new file mode 100644 index 0000000..a9f3be7 --- /dev/null +++ b/formalizations/guarded-cubical/GradualSTLC.agda @@ -0,0 +1,142 @@ +{-# OPTIONS --cubical --rewriting --guarded #-} + +module GradualSTLC where + + +open import Cubical.Foundations.Prelude +open import Cubical.Data.Nat + +-- Types -- + + +data Ty : Set where + nat : Ty + dyn : Ty + _=>_ : Ty -> Ty -> Ty + +infixr 5 _=>_ + +data _⊑_ : Ty -> Ty -> Set where + dyn : dyn ⊑ dyn + _=>_ : {A A' B B' : Ty} -> + A ⊑ A' -> B ⊑ B' -> (A => B) ⊑ (A' => B') + nat : nat ⊑ nat + inj-nat : nat ⊑ dyn + inj-arrow : {A : Ty} -> + A ⊑ (dyn => dyn) -> A ⊑ dyn + -- inj-arrow : {A A' : Ty} -> + -- (A => A') ⊑ (dyn => dyn) -> (A => A') ⊑ dyn + +-- Contexts -- + +data Ctx : Set where + · : Ctx + _::_ : Ctx -> Ty -> Ctx + +infixr 5 _::_ + + +-- "Contains" relation stating that a context Γ contains a type T + +data _∋_ : Ctx -> Ty -> Set where + vz : ∀ {Γ S} -> Γ :: S ∋ S + vs : ∀ {Γ S T} (x : Γ ∋ T) -> (Γ :: S ∋ T) + +infix 4 _∋_ + + +-- Simply-typed terms, presented via their typing rules + +data Tm : Ctx -> Ty -> Set where + var : ∀ {Γ T} -> Γ ∋ T -> Tm Γ T + lda : ∀ {Γ S T} -> (Tm (Γ :: S) T) -> Tm Γ (S => T) + app : ∀ {Γ S T} -> (Tm Γ (S => T)) -> (Tm Γ S) -> (Tm Γ T) + err : ∀ {Γ A} -> Tm Γ A + up : ∀ {Γ A B} -> A ⊑ B -> Tm Γ A -> Tm Γ B + dn : ∀ {Γ A B} -> A ⊑ B -> Tm Γ B -> Tm Γ A + +-- infix 4 _â–¸_ + + +-- ================================================================= -- + +-- Type of "proofs" -- + + +ProofT = Ctx -> Ty -> Set + + +VarToProof : ProofT -> Set +VarToProof _â—†_ = ∀ {Γ T} -> (Γ ∋ T) -> (Γ â—† T) +-- The diamond is a function, and the underscores around it allow us to use it in infix + +ProofToTm : ProofT -> Set +ProofToTm _â—†_ = ∀ {Γ T} -> (Γ â—† T) -> (Tm Γ T) + +WeakeningMap : ProofT -> Set +WeakeningMap _â—†_ = ∀ {Γ S T} -> (Γ â—† T) -> ((Γ :: S) â—† T) + + + +-- Kits -- + +data Kit (â—† : ProofT) : Set where + kit : ∀ (vr : VarToProof â—†) (tm : ProofToTm â—†) (wk : WeakeningMap â—†) -> Kit â—† + + +-- Substitutions -- + +Subst : Ctx -> Ctx -> ProofT -> Set +Subst Δ Γ _â—ˆ_ = ∀ {T} -> (Γ ∋ T) -> (Δ â—ˆ T) + + +-- Lift function -- + +lft : {Δ Γ : Ctx} {S : Ty} {_â—ˆ_ : ProofT} + (K : Kit _â—ˆ_) (Ï„ : Subst Δ Γ _â—ˆ_) {T : Ty} (h : (Γ :: S) ∋ T) -> (Δ :: S) â—ˆ T +lft (kit vr tm wk) Ï„ vz = vr vz +lft (kit vr tm wk) Ï„ (vs x) = wk (Ï„ x) + +-- Note that the type of lft can also be written as (Subst Δ Γ _â—ˆ_) -> (Subst (Δ ∷ S) (Γ ∷ S) _â—ˆ_) + + +-- Traversal function -- + +trav : {Δ Γ : Ctx} {T : Ty} {_â—ˆ_ : ProofT} (K : Kit _â—ˆ_) + (Ï„ : Subst Δ Γ _â—ˆ_) (t : Tm Γ T) -> Tm Δ T +trav (kit vr tm wk) Ï„ (var x) = tm (Ï„ x) +trav K Ï„ (lda t') = lda (trav K (lft K Ï„) t') +trav K Ï„ (app f s) = app (trav K Ï„ f) (trav K Ï„ s) +trav K Ï„ (up deriv t') = up deriv (trav K Ï„ t') +trav K Ï„ (dn deriv t') = dn deriv (trav K Ï„ t') +trav K Ï„ err = err + +-- Renaming -- + +idContains : {Γ : Ctx} {T : Ty} (t : Γ ∋ T) -> Γ ∋ T +idContains t = t + +varKit : Kit _∋_ +varKit = kit idContains var vs + +rename : {Γ Δ : Ctx} {T : Ty} (Ï : Subst Δ Γ _∋_) (t : Tm Γ T) -> Tm Δ T +rename Ï t = trav varKit Ï t + + + +-- Substitution -- + +idTerm : {Γ : Ctx} {T : Ty} (t : Tm Γ T) -> Tm Γ T +idTerm t = t + +weakenTerm : WeakeningMap Tm +weakenTerm = rename vs + +termKit : Kit Tm +termKit = kit var idTerm weakenTerm + +sub : (Δ Γ : Ctx) (σ : Subst Δ Γ Tm) (T : Ty) (t : Tm Γ T) -> Tm Δ T +sub Δ Γ σ T t = trav termKit σ t + + + -- GitLab