This commit is contained in:
Michael Zhang 2024-10-08 04:47:55 -05:00
parent 78fe433b0d
commit 705372bd9c
6 changed files with 233 additions and 92 deletions

View file

@ -6,4 +6,4 @@ including my progress into research for my master's degree.
Links:
- [my current focus](https://git.mzhang.io/school/cubical/projects/2)
- [my current focus](https://git.mzhang.io/michael/type-theory/projects/8)

View file

@ -1,22 +0,0 @@
{-# OPTIONS --guardedness #-}
module CEKCoinductive where
open import Agda.Primitive
private
variable
l l1 l2 l3 : Level
E : Set Set
R : Set
data ITreeF (ITree : Set) : Set where
Ret : (r : R) ITreeF ITree
Tau : (t : ITree) ITreeF ITree
Vis : {A : Set l1} (e : E A) (k : A ITreeF E R) ITreeF E R
record ITree : Set where
coinductive
field
_observe : ITreeF ITree

View file

@ -0,0 +1,26 @@
{-# OPTIONS --cubical #-}
module CubicalHott.Exercise4-6 where
open import Cubical.Core.Glue
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Function
open import Cubical.Foundations.GroupoidLaws
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Transport
variable
l : Level
A B : Type
idtoqinv : A B Iso A B
idtoqinv {A} {B} p = iso (transport p) (transport (sym p)) s r where
s : section (transport p) (transport (λ i p (~ i)))
s b = sym (transportComposite (sym p) p b) cong (λ p transport p b) (rCancel (sym p)) transportRefl b
r : retract (transport p) (transport (λ i p (~ i)))
r a = sym (transportComposite p (sym p) a) cong (λ p transport p a) (rCancel p) transportRefl a
postulate
idtoqinv-← : Iso A B A B

View file

@ -12,14 +12,7 @@ open import Cubical.Data.Nat
open import Data.Unit
lemma : {l} (n : HLevel) isOfHLevel (suc n) (TypeOfHLevel l n)
lemma zero (A , a , Acontr) (B , b , Bcontr) i = G , g , {! !} where
-- G : A ≡ B
-- G = ua (isoToEquiv (iso (λ _ → b) (λ _ → a) Bcontr Acontr))
-- g : PathP (λ i → G i) a b
-- g = {! !}
-- contr : Acontr ≡ Bcontr
lemma zero (A , a , Acontr) (B , b , Bcontr) i = G , g , contr where
eqv1 : A B
eqv1 = isoToEquiv (iso (λ _ b) (λ _ a) Bcontr Acontr)
@ -31,7 +24,11 @@ lemma zero (A , a , Acontr) (B , b , Bcontr) i = G , g , {! !} where
g = glue {T = T} {e = e} (λ { (i = i0) a ; (i = i1) b }) b
contr : (y : G) g y
contr y j = {! !}
contr y j =
let p = λ where
(i = i0) Acontr (unglue {A = A} (~ i) {T = T} {e = λ { (i = i0) idEquiv A }} y) j
(i = i1) Bcontr (unglue {A = B} i {T = T} {e = λ { (i = i1) idEquiv B }} y) j
in glue p {! b !}
-- unglue i {! !}
-- (glue (λ { (i = i1) → {! !} }) {! !})

View file

@ -1,60 +0,0 @@
```
{-# OPTIONS --cubical #-}
module Log where
open import Cubical.Foundations.Prelude
```
## 2024-09-12
Trying to get hcomp to work
```
module log-20240912 where
private
variable
l : Level
A : Type l
x y z w : A
p : x ≡ y
q : y ≡ z
r : z ≡ w
s : w ≡ x
-- Order of the square is
-- 4
-- +----->+
-- ^ ^
-- 1 | | 2
-- | |
-- +----->+
-- 3
-- In this below case, i is the vertical dimension and j is the horizontal dimension
test-square : Square refl refl p p
test-square {l} {A} {x} {y} {p} i j = p i
-- Creating the same square with hfill
test-square2 : p ∙ refl ≡ p
test-square2 {l} {A} {x} {y} {p} i j = hfill (λ k → λ where
(j = i0) → x
(j = i1) → y
)
-- A [ ~ j j ↦ (λ { (j = i0) → x ; (j = i1) → y }) ]
-- looking for some expression s.t when φ = i1, will equal the thing in the expression
(inS (p j))
(~ i)
-- Trying to port over the 1lab filler
-- This fills a square
∙∙-filler : Square s q p (sym s ∙∙ p ∙∙ q)
∙∙-filler {l} {A} {x} {y} {z} {w} {p} {q} {s} i j = hfill (λ k → λ where
(j = i0) → {! s (~ i) !}
(j = i1) → {! !}
)
{! !} {! i !}
```
Question:
- How many sides do you need for the hcomp to be correct?
- What direction, semantically, is the last argument to hfill?

200
src/LogRel.agda Normal file
View file

@ -0,0 +1,200 @@
module LogRel where
open import Data.Bool
open import Data.String
open import Data.Sum
open import Data.Empty
open import Data.Nat
open import Data.Maybe
open import Data.Product
open import Relation.Binary.PropositionalEquality
open import Relation.Nullary.Negation
open import Relation.Nullary using (Dec; yes; no)
_∙_ = trans
data type : Set where
bool : type
_-→_ : type type type
data term : Set where
`_ : String term
true : term
false : term
`if_then_else_ : term term term term
`λ[__]_ : String type term term
_`∙_ : term term term
replace : (e : term) (x : String) (v : term) term
replace (` y) x v = if x == y then v else (` y)
replace true x v = true
replace false x v = false
replace (`if e then e₁ else e₂) x v = `if (replace e x v) then replace e₁ x v else replace e₂ x v
replace e @ (`λ[ y t ] e) x v = if x == y then e else (`λ[ y t ] replace e x v)
replace (e₁ `∙ e₂) x v = replace e₁ x v `∙ replace e₂ x v
data value : term Set where
true : value true
false : value false
`λ[__]_ : (x : String) (t : type) (e : term) value (`λ[ x t ] e)
to-value : (t : term) Maybe (value t)
to-value (` x) = nothing
to-value true = just true
to-value false = just false
to-value (`if t then t₁ else t₂) = nothing
to-value (`λ[ x t ] e) = just (`λ[ x t ] e)
to-value (t `∙ t₁) = nothing
is-value : (t : term) Set
is-value t = Is-just (to-value t)
data ectx : Set where
[∙] : ectx
`if_then_else_ : ectx term term ectx
_`∙_ : ectx term ectx
_∙`_ : {e : term} value e ectx ectx
data ctx : Set where
: ctx
_,__ : ctx String type ctx
data sub : Set where
: sub
_,_≔_ : sub String term sub
evalsub : sub term term
evalsub e = e
evalsub (γ , x v) e = replace (evalsub γ e) x v
lookup : ctx String Maybe type
lookup x = nothing
lookup (Γ , y t) x = if (x == y) then just t else lookup Γ x
-- Some dumb stuff
lemma1 : (γ : sub) evalsub γ true true
lemma1 = refl
lemma1 (γ , x v) = cong (λ z replace z x v) (lemma1 γ)
lemma2 : (γ : sub) evalsub γ false false
lemma2 = refl
lemma2 (γ , x v) = cong (λ z replace z x v) (lemma2 γ)
-- Operational semantics
data _↦_ : term term Set where
rule1 : (e1 e2 : term) (if true then e1 else e2) e1
rule2 : (e1 e2 : term) (if false then e1 else e2) e2
rule3 : (x : String) (t : type) (e : term) (v : term)
((`λ[ x t ] e) `∙ v) replace e x v
data iter : term term Set where
iter-zero : (e : term) iter zero e e
iter-suc : (n : ) (e e e : term) iter n e e (e e) iter (suc n) e e
_↦∙_ : term term Set
e ↦∙ e = Σ λ n iter n e e
-- Type judgments
data _⊢__ : ctx term type Set where
type1 : (Γ : ctx) Γ true bool
type2 : (Γ : ctx) Γ false bool
type3 : (Γ : ctx) (x : String) (tw : Is-just (lookup Γ x)) Γ ` x to-witness tw
type4 : (Γ : ctx) (x : String) (e : term) (t₁ t₂ : type)
((Γ , x t₁) e t₂) Γ `λ[ x t₁ ] e (t₁ -→ t₂)
type5 : (Γ : ctx) (e₁ e₂ : term) (t t₂ : type)
(Γ e₁ (t₂ -→ t)) (Γ e₂ t₂) Γ e₁ `∙ e₂ t
type6 : (Γ : ctx) (e e₁ e₂ : term) (t : type)
(Γ e bool) (Γ e₁ t) (Γ e₂ t)
Γ `if e then e₁ else e₂ t
-- Type soundness
type-soundness : {e e t} ( e t) (e ↦∙ e) Set
type-soundness {e = e} {e = e} {t = t} prf eval =
(value e) Σ term λ e e e
-- Safety
safe : term Set
safe e = (e : term) e ↦∙ e (value e) Σ term (λ e (e e))
-- Logical relations
data V : type term Set
data E : type term Set
data V where
bool-true : V bool true
bool-false : V bool false
→-λ : (x : String) (e : term) (t₁ t₂ : type)
((v : term) V t₁ v E t₂ (replace e x v)) V (t₁ -→ t₂) (`λ[ x t₁ ] e)
irred : (e : term) Set
irred e = ¬ (Σ term (λ e e e))
data E where
erel : (e : term) (t : type)
((e : term) ((e ↦∙ e) × irred e) V t e) E t e
data G : ctx sub Set where
nil : G
cons : (Γ : ctx) (x : String) (t : type) (γ : sub) (v : term)
(G Γ γ) V t v
G (Γ , x t) (γ , x v)
-- Semantically well-typed
_⊨__ : (Γ : ctx) (e : term) (t : type) Set
Γ e t = (γ : sub) G Γ γ E t (evalsub γ e)
-- Theorem 4.2: fundamental property of logical relations
theorem42 : (Γ : ctx) (e : term) (t : type) Γ e t Γ e t
theorem42 Γ e t (type1 .Γ) γ G[γ] =
subst (E bool) (sym (lemma1 γ)) (erel e bool helper) where
helper : (e : term) (true ↦∙ e) × irred e V bool e
helper e ((zero , iter-zero .true) , snd) = bool-true
helper e ((suc n , iter-suc .n e .true .true fst (rule1 .true e2)) , snd) = bool-true
helper e ((suc n , iter-suc .n e .true .true fst (rule2 e1 .true)) , snd) = bool-true
theorem42 Γ e t (type2 .Γ) γ G[γ] =
subst (E bool) (sym (lemma2 γ)) (erel e bool helper) where
helper : (e : term) (false ↦∙ e) × irred e V bool e
helper e ((zero , iter-zero .false) , snd) = bool-false
helper e ((suc n , iter-suc .n e .false .false fst (rule1 .false e2)) , snd) = bool-false
helper e ((suc n , iter-suc .n e .false .false fst (rule2 e1 .false)) , snd) = bool-false
theorem42 Γ e t (type3 .Γ x tw) γ G[γ] = erel {! !} {! !} {! !}
theorem42 Γ e t (type4 .Γ x e₁ t₁ t₂ sts) G[γ] = erel (`λ[ x t₁ ] e₁) t helper where
helper : (e : term) ((`λ[ x t₁ ] e₁) ↦∙ e) × irred e V (t₁ -→ t₂) e
helper e ((zero , iter-zero .(`λ[ x t₁ ] e₁)) , snd) =
x e₁ t₁ t₂ λ v x₁ erel {! !} {! !} {! !}
helper e ((suc n , fst) , snd) = {! !}
theorem42 Γ e t (type4 .Γ x e₁ t₁ t₂ sts) (γ , x₁ x₂) G[γ] =
{! !}
theorem42 Γ e t (type5 .Γ e₁ e₂ .t t₂ sts sts₁) = {! !}
theorem42 Γ e t (type6 .Γ e₁ e₂ e₃ .t sts sts₁ sts₂) G[γ] =
erel (`if e₁ then e₂ else e₃) t helper where
helper : (e : term) ((`if e₁ then e₂ else e₃) ↦∙ e) × irred e V t e
helper e ((zero , iter-zero .(`if e₁ then e₂ else e₃)) , snd) =
⊥-elim (snd ((`if e₁ then e₂ else e₃) , rule1 (`if e₁ then e₂ else e₃) e₂))
helper e ((suc n , iter-suc .n e .(`if e₁ then e₂ else e₃) .(`if e₁ then e₂ else e₃) fst (rule1 .(`if e₁ then e₂ else e₃) e2)) , snd) =
⊥-elim (snd ((`if e₁ then e₂ else e₃) , rule1 (`if e₁ then e₂ else e₃) e₂))
helper e ((suc n , iter-suc .n e .(`if e₁ then e₂ else e₃) .(`if e₁ then e₂ else e₃) fst (rule2 e1 .(`if e₁ then e₂ else e₃))) , snd) =
⊥-elim (snd ((`if e₁ then e₂ else e₃) , rule1 (`if e₁ then e₂ else e₃) e₂))
theorem42 Γ e t (type6 .(Γ₁ , x t₁) e₁ e₂ e₃ .t sts sts₁ sts₂) (γ , x x₁) (cons Γ₁ .x t₁ .γ .x₁ (inj₁ x₂)) = {! !}
theorem42 Γ e t (type6 .(Γ₁ , x t₁) e₁ e₂ e₃ .t sts sts₁ sts₂) (γ , x x₁) (cons Γ₁ .x t₁ .γ .x₁ (inj₂ y)) = {! !}
-- Theorem 4.1: semantic type soundness
theorem41 : (e : term) (t : type) ( e t) safe e
theorem41 e t ts = goal1 where
swt : e t
swt = theorem42 e t ts
goal2 : E t e
goal2 = swt nil
goal1 : safe e
goal1 e prf = {! !}