From 69688762bf24c323884315a91f60a90ec06f62c9 Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Thu, 9 Dec 2021 04:32:32 -0600 Subject: [PATCH] Better understanding of the types now --- src/Project/Cesk.agda | 20 ++++++++++++++++---- src/Project/Definitions.agda | 23 ++++++++++++++++++++--- src/Project/notes.txt | 6 ++++++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/Project/Cesk.agda b/src/Project/Cesk.agda index 550914c..804ccc6 100644 --- a/src/Project/Cesk.agda +++ b/src/Project/Cesk.agda @@ -28,11 +28,23 @@ step (mkState Tc Γ (case C isZ isS) E K) with astep C E ... | suc n = part $ mkState Tc Γ (isS · value n) E K step (mkState Tc Γ (x₁ · x₂) E K) with astep x₁ E ... | clo body env = apply-proc-clo body env (astep x₂ E) K -... | cont halt = done $ {! !} -... | cont (kont k) = {! apply-kont (kont k) ? !} +... | cont halt = {! !} +... | cont (kont x) = {! !} +-- ... | cont k = apply-kont {! k !} (astep x₂ E) -- ... | clo body env = apply-proc-clo body env (astep x₂ E) K -step (mkState Tc Γ (call/cc x) E K) with astep x E -... | proc = {! !} +step (mkState Tc Γ (call/cc {A} aexp) E K) with astep aexp E +... | clo {Γc} body env = + part $ mkState Tc (Γc , A ⇒ ⊥) body (env [ A ⇒ ⊥ ∶ cont K ]) K +... | cont k = apply-kont K {! !} +-- part $ mkState ((A ⇒ ⊥) ⇒ Tc) Γ aexp E K′ +-- let Γ′ = Γ , A ⇒ ⊥ in +-- let E′ = E [ A ⇒ ⊥ ∶ cont {! !} ] in +-- part $ mkState (((A ⇒ ⊥) ⇒ Tc)) Γ′ aexp E′ {! !} +step (mkState Tc Γ (abort V⊥) E K) with astep V⊥ E +... | () +step (mkState Tc Γ (`let {A} C₁ C₂) E K) = + let K′ = letk Γ C₂ E K in + part $ mkState A Γ C₁ E (kont K′) --... | clo {Γc} {A} {B} body env = -- let T = Κ[ Tc ⇒ ⊥ ] in -- let v = cont K in diff --git a/src/Project/Definitions.agda b/src/Project/Definitions.agda index bd7bf68..83bf70d 100644 --- a/src/Project/Definitions.agda +++ b/src/Project/Definitions.agda @@ -12,8 +12,8 @@ infixr 7 _⇒_ data Type : Set where ⊥ : Type - _⇒_ : Type → Type → Type `ℕ : Type + _⇒_ : Type → Type → Type data Context : Set where ∅ : Context @@ -49,6 +49,8 @@ data Aexp Γ where ƛ : ∀ {B} {A : Type} → Exp (Γ , A) B → Aexp Γ (A ⇒ B) data Exp Γ where + abort : ∀ {A} → Aexp Γ ⊥ → Exp Γ A + -- Atomic expressions atomic : ∀ {A} → Aexp Γ A → Exp Γ A @@ -59,7 +61,21 @@ data Exp Γ where _·_ : ∀ {A B} → Aexp Γ (A ⇒ B) → Aexp Γ A → Exp Γ B -- Call/cc - call/cc : ∀ {A B Tω} → Aexp Γ ((A ⇒ ⊥) ⇒ B) → Exp Γ Tω + call/cc : ∀ {A Tω} → Aexp (Γ) ((A ⇒ ⊥) ⇒ Tω) → Exp Γ Tω + + -- Let + `let : ∀ {A B : Type} → Exp Γ A → Exp (Γ , A) B → Exp Γ B + + +-- exp = let (call/cc ƛ . let (abort `0) (`0 · 2)) ((\ . suc `0) · `0) +-- exp = let (s = call/cc ƛk . let (k' = abort k) (k' · 2)) (suc s) +-- exp = 3 +exp : Exp ∅ `ℕ +exp = + `let (call/cc ( + -- `let (` zero · suc (suc zero)) (abort (` zero)) + ƛ (` zero · suc (suc zero)) + )) (`let (abort (` zero)) ((ƛ (atomic (suc (` suc zero)))) · ` zero)) data Kont (Tω : Type) : Type → Set record Letk (Tv Tω : Type) : Set @@ -73,7 +89,8 @@ data Value where clo : ∀ {Γ} {A B : Type} → Exp (Γ , A) B → Env Γ → Value (A ⇒ B) -- Call/CC - cont : ∀ {Tω A} → Kont Tω A → Value (A ⇒ ⊥) + -- cont : ∀ {Tω A} → Kont Tω A → Value (A ⇒ ⊥) + cont : ∀ {Tω A B} → Kont Tω A → Value (B ⇒ ⊥) record Letk Tω Tv where inductive diff --git a/src/Project/notes.txt b/src/Project/notes.txt index b2eccbd..38e4b1e 100644 --- a/src/Project/notes.txt +++ b/src/Project/notes.txt @@ -36,6 +36,12 @@ len (call/cc k . if k "hello" is even then true else false) --- +(call/cc \k . k 3) + +done 3 + +--- + 3 + (call/cc \k . abort (k 2)) abort : _|_ -> A