Created
November 9, 2017 10:11
-
-
Save gergoerdi/05b0e0ba5ab38c9a599785bb6392dcdf to your computer and use it in GitHub Desktop.
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
open import Data.Nat | |
open import Relation.Binary.PropositionalEquality renaming (subst to ≡-subst) | |
open import Data.Empty | |
open import Data.Unit | |
open import Relation.Binary | |
open import Data.Star | |
open import Level renaming (zero to lzero; suc to lsuc) | |
open import Data.Product | |
open import Function using (_⟨_⟩_) | |
-- open import Function using (_∘_; id) | |
data Ty : Set where | |
fun : Ty → Ty → Ty | |
infixl 21 _▷_ | |
data Ctx : Set where | |
[] : Ctx | |
_▷_ : Ctx → Ty → Ctx | |
data Var (t : Ty) : Ctx → Set where | |
vz : ∀ {Γ} → Var t (Γ ▷ t) | |
vs : ∀ {Γ u} → Var t Γ → Var t (Γ ▷ u) | |
data _⊆_ : Ctx → Ctx → Set where | |
done : [] ⊆ [] | |
keep : ∀ {a Γ Δ} → Γ ⊆ Δ → Γ ▷ a ⊆ Δ ▷ a | |
drop : ∀ {a Γ Δ} → Γ ⊆ Δ → Γ ⊆ Δ ▷ a | |
⊆-refl : ∀ {Γ} → Γ ⊆ Γ | |
⊆-refl {[]} = done | |
⊆-refl {Γ ▷ _} = keep ⊆-refl | |
[]⊆ : ∀ Γ → [] ⊆ Γ | |
[]⊆ [] = done | |
[]⊆ (Γ ▷ _) = drop ([]⊆ Γ) | |
⊆-trans : ∀ {Γ Θ Δ} → Γ ⊆ Θ → Θ ⊆ Δ → Γ ⊆ Δ | |
⊆-trans done Θ⊆Δ = Θ⊆Δ | |
⊆-trans (keep Γ⊆Θ) (keep Θ⊆Δ) = keep (⊆-trans Γ⊆Θ Θ⊆Δ) | |
⊆-trans (drop Γ⊆Θ) (keep Θ⊆Δ) = drop (⊆-trans Γ⊆Θ Θ⊆Δ) | |
⊆-trans Γ⊆Θ (drop Θ⊆Δ) = drop (⊆-trans Γ⊆Θ Θ⊆Δ) | |
open import Data.List using (List; _∷_; []) | |
infixl 22 _<><_ | |
_<><_ : Ctx → List Ty → Ctx | |
Γ <>< [] = Γ | |
Γ <>< (t ∷ Δ) = (Γ ▷ t) <>< Δ | |
data Tm (Γ : Ctx) : Ty → Set where | |
var : ∀ {t} → Var t Γ → Tm Γ t | |
lam : ∀ t {u} → (e : Tm (Γ ▷ t) u) → Tm Γ (fun t u) | |
app : ∀ {u t} → (f : Tm Γ (fun u t)) → (e : Tm Γ u) → Tm Γ t | |
wk-var : ∀ {Γ Δ t} → Γ ⊆ Δ → Var t Γ → Var t Δ | |
wk-var done () | |
wk-var (keep Γ⊆Δ) vz = vz | |
wk-var (keep Γ⊆Δ) (vs v) = vs (wk-var Γ⊆Δ v) | |
wk-var (drop Γ⊆Δ) v = vs (wk-var Γ⊆Δ v) | |
wk : ∀ {Γ Δ t} → Γ ⊆ Δ → Tm Γ t → Tm Δ t | |
wk Γ⊆Δ (var v) = var (wk-var Γ⊆Δ v) | |
wk Γ⊆Δ (lam t e) = lam t (wk (keep Γ⊆Δ) e) | |
wk Γ⊆Δ (app f e) = app (wk Γ⊆Δ f) (wk Γ⊆Δ e) | |
wk-var-refl : ∀ {Γ t} (x : Var t Γ) → wk-var ⊆-refl x ≡ x | |
wk-var-refl vz = refl | |
wk-var-refl (vs x) = cong vs (wk-var-refl x) | |
wk-refl : ∀ {Γ t} (e : Tm Γ t) → wk ⊆-refl e ≡ e | |
wk-refl (var x) = cong var (wk-var-refl x) | |
wk-refl (lam t e) = cong (lam t) (wk-refl e) | |
wk-refl (app f e) = cong₂ app (wk-refl f) (wk-refl e) | |
wk-var-trans : ∀ {Γ Θ Δ t} (Γ⊆Θ : Γ ⊆ Θ) (Θ⊆Δ : Θ ⊆ Δ) (x : Var t Γ) → wk-var Θ⊆Δ (wk-var Γ⊆Θ x) ≡ wk-var (⊆-trans Γ⊆Θ Θ⊆Δ) x | |
wk-var-trans done Θ⊆Δ () | |
wk-var-trans (keep Γ⊆Θ) (keep Θ⊆Δ) vz = refl | |
wk-var-trans (keep Γ⊆Θ) (keep Θ⊆Δ) (vs x) rewrite wk-var-trans Γ⊆Θ Θ⊆Δ x = refl | |
wk-var-trans (drop Γ⊆Θ) (keep Θ⊆Δ) x rewrite wk-var-trans Γ⊆Θ Θ⊆Δ x = refl | |
wk-var-trans (keep Γ⊆Θ) (drop Θ⊆Δ) x rewrite wk-var-trans (keep Γ⊆Θ) Θ⊆Δ x = refl | |
wk-var-trans (drop Γ⊆Θ) (drop Θ⊆Δ) x rewrite wk-var-trans (drop Γ⊆Θ) Θ⊆Δ x = refl | |
wk-trans : ∀ {Γ Θ Δ t} (Γ⊆Θ : Γ ⊆ Θ) (Θ⊆Δ : Θ ⊆ Δ) (e : Tm Γ t) → wk Θ⊆Δ (wk Γ⊆Θ e) ≡ wk (⊆-trans Γ⊆Θ Θ⊆Δ) e | |
wk-trans Γ⊆Θ Θ⊆Δ (var x) rewrite wk-var-trans Γ⊆Θ Θ⊆Δ x = refl | |
wk-trans Γ⊆Θ Θ⊆Δ (lam t e) = cong (lam t) (wk-trans (keep Γ⊆Θ) (keep Θ⊆Δ) e) | |
wk-trans Γ⊆Θ Θ⊆Δ (app f e) = cong₂ app (wk-trans Γ⊆Θ Θ⊆Δ f) (wk-trans Γ⊆Θ Θ⊆Δ e) | |
_⊢⋆_ : Ctx → Ctx → Set | |
Γ ⊢⋆ Δ = ∀ {t} → Var t Δ → Tm Γ t | |
Shub : Ctx → Ctx → Set | |
Shub Γ Δ = ∀ Ξ → (Γ <>< Ξ) ⊢⋆ (Δ <>< Ξ) | |
subst : ∀ {Γ Δ t} → Shub Γ Δ → Tm Δ t → Tm Γ t | |
subst σ (var x) = σ [] x | |
subst σ (lam t e) = lam t (subst (σ ∘ (t ∷_)) e) | |
where | |
open import Function using (_∘_) | |
subst σ (app f e) = app (subst σ f) (subst σ e) | |
mono : ∀ {Γ Δ t} → Γ ⊢⋆ Δ → Γ ▷ t ⊢⋆ Δ ▷ t | |
mono σ vz = var vz | |
mono σ (vs x) = wk (drop ⊆-refl) (σ x) | |
wks : ∀ {Γ Δ Θ} → Γ ⊆ Θ → Γ ⊢⋆ Δ → Θ ⊢⋆ Δ | |
wks sub σ x = wk sub (σ x) | |
sub : ∀ {Γ Δ} → Γ ⊢⋆ Δ → Shub Γ Δ | |
sub σ [] = σ | |
sub σ (x ∷ Ξ) = sub (mono σ) Ξ | |
push : ∀ {Γ t} → Tm Γ t → Γ ⊢⋆ Γ ▷ t | |
push e₀ vz = e₀ | |
push e₀ (vs x) = var x | |
extend : ∀ {Γ Δ t} → Tm Γ t → Γ ⊢⋆ Δ → Γ ⊢⋆ (Δ ▷ t) | |
extend e σ vz = e | |
extend e σ (vs x) = σ x | |
-- ⊆⇒⊢⋆ : ∀ {Γ Δ} → Δ ⊆ Γ → Γ ⊢⋆ Δ | |
-- ⊆⇒⊢⋆ sub e = wk sub e | |
-- ⊢⋆-trans : ∀ {Γ Δ Θ} → Γ ⊢⋆ Θ → Θ ⊢⋆ Δ → Γ ⊢⋆ Δ | |
-- ⊢⋆-trans σ [] = [] | |
-- ⊢⋆-trans σ (ρ ▷ e) = ⊢⋆-trans σ ρ ▷ subst σ e | |
-- ⊢⋆-refl : ∀ {Γ} → Γ ⊢⋆ Γ | |
-- ⊢⋆-refl = ⊆⇒⊢⋆ ⊆-refl | |
-- subst-var-⊆ : ∀ {Δ Γ Γ′ t} σ (x : Var t Δ) (sub : Γ ⊆ Γ′) → | |
-- subst-var (⊢⋆-wk sub σ) x ≡ wk sub (subst-var σ x) | |
-- subst-var-⊆ {[]} [] () sub | |
-- subst-var-⊆ {Δ ▷ _} (σ ▷ e) vz sub = refl | |
-- subst-var-⊆ {Δ ▷ _} (σ ▷ e) (vs x) sub = subst-var-⊆ σ x sub | |
-- subst-wk-var : ∀ {Γ Δ t} (sub : Γ ⊆ Δ) (x : Var t Γ) → subst-var (⊆⇒⊢⋆ sub) x ≡ var (wk-var sub x) | |
-- subst-wk-var {[]} sub () | |
-- subst-wk-var {Γ ▷ x} (keep sub) vz = refl | |
-- subst-wk-var {Γ ▷ _} (keep sub) (vs x) = | |
-- subst-var-⊆ (⊆⇒⊢⋆ sub) x (drop ⊆-refl) | |
-- ⟨ trans ⟩ | |
-- cong (wk (drop ⊆-refl)) (subst-wk-var sub x) | |
-- ⟨ trans ⟩ | |
-- cong (λ y → var (vs y)) (wk-var-refl (wk-var sub x)) | |
-- subst-wk-var {Γ ▷ _} (drop sub) x = | |
-- subst-var-⊆ (⊆⇒⊢⋆ sub) x (drop ⊆-refl) | |
-- ⟨ trans ⟩ | |
-- cong (wk (drop ⊆-refl)) (subst-wk-var sub x) | |
-- ⟨ trans ⟩ | |
-- cong (λ y → var (vs y)) (wk-var-refl (wk-var sub x)) | |
-- subst-wk : ∀ {Γ Δ t} (sub : Γ ⊆ Δ) (e : Tm Γ t) → subst (⊆⇒⊢⋆ sub) e ≡ wk sub e | |
-- subst-wk sub (var x) = subst-wk-var sub x | |
-- subst-wk sub (lam t e) = cong (lam t) (subst-wk (keep sub) e) | |
-- subst-wk sub (app f e) = cong₂ app (subst-wk sub f) (subst-wk sub e) | |
-- subst-refl : ∀ {Γ t} → (e : Tm Γ t) → subst ⊢⋆-refl e ≡ e | |
-- subst-refl {Γ} e = subst-wk ⊆-refl e ⟨ trans ⟩ wk-refl e | |
-- todo1 : ∀ {Γ u t} (σ : [] ⊢⋆ Γ) (e : Tm (Γ ▷ u) t) (e′ : Tm [] u) → | |
-- subst ([] ▷ e′) (subst (sub (wks σ)) e) ≡ subst (σ ▷ e′) e | |
-- -- todo1 σ e e′ rewrite sym (⊢⋆-wk-refl ([] ▷ e′)) | sym (⊢⋆-wk-refl (σ ▷ e′)) = todo11 ([] ▷ e′) σ e | |
data Value : {Γ : Ctx} → {t : Ty} → Tm Γ t → Set where | |
lam : ∀ {Γ t} → ∀ u (e : Tm _ t) → Value {Γ} (lam u e) | |
data _==>_ {Γ} : ∀ {t} → Rel (Tm Γ t) lzero where | |
app-lam : ∀ {t u} (f : Tm _ t) {v : Tm _ u} → Value v → app (lam u f) v ==> subst (sub (push v)) f | |
appˡ : ∀ {t u} {f f′ : Tm Γ (fun u t)} → f ==> f′ → (e : Tm Γ u) → app f e ==> app f′ e | |
appʳ : ∀ {t u} {f} → Value {Γ} {fun u t} f → ∀ {e e′ : Tm Γ u} → e ==> e′ → app f e ==> app f e′ | |
_==>*_ : ∀ {Γ t} → Rel (Tm Γ t) _ | |
_==>*_ = Star _==>_ | |
NF : ∀ {a b} {A : Set a} → Rel A b → A → Set _ | |
NF step x = ∄ (step x) | |
value⇒normal : ∀ {Γ t e} → Value {Γ} {t} e → NF _==>_ e | |
value⇒normal (lam t e) (_ , ()) | |
Deterministic : ∀ {a b} {A : Set a} → Rel A b → Set _ | |
Deterministic step = ∀ {x y y′} → step x y → step x y′ → y ≡ y′ | |
deterministic : ∀ {Γ t} → Deterministic (_==>_ {Γ} {t}) | |
deterministic (app-lam f _) (app-lam ._ _) = refl | |
deterministic (app-lam f v) (appˡ () _) | |
deterministic (app-lam f v) (appʳ f′ e) = ⊥-elim (value⇒normal v (, e)) | |
deterministic (appˡ () e) (app-lam f v) | |
deterministic (appˡ f e) (appˡ f′ ._) = cong _ (deterministic f f′) | |
deterministic (appˡ f e) (appʳ f′ _) = ⊥-elim (value⇒normal f′ (, f)) | |
deterministic (appʳ f e) (app-lam f′ v) = ⊥-elim (value⇒normal v (, e)) | |
deterministic (appʳ f e) (appˡ f′ _) = ⊥-elim (value⇒normal f (, f′)) | |
deterministic (appʳ f e) (appʳ f′ e′) = cong _ (deterministic e e′) | |
Halts : ∀ {Γ t} → Tm Γ t → Set | |
Halts e = ∃ λ e′ → e ==>* e′ × Value e′ | |
value⇒halts : ∀ {Γ t e} → Value {Γ} {t} e → Halts e | |
value⇒halts {e = e} v = e , ε , v | |
-- -- This would not be strictly positive! | |
-- data Saturated : ∀ {Γ t} → Tm Γ t → Set where | |
-- fun : ∀ {t u} {f : Tm [] (fun t u)} → Halts f → (∀ {e} → Saturated e → Saturated (app f e)) → Saturated f | |
mutual | |
Saturated : ∀ {t} → Tm [] t → Set | |
Saturated e = Halts e × Saturated′ _ e | |
Saturated′ : ∀ t → Tm [] t → Set | |
Saturated′ (fun t u) f = ∀ {e} → Saturated e → Saturated (app f e) | |
saturated⇒halts : ∀ {t e} → Saturated {t} e → Halts e | |
saturated⇒halts = proj₁ | |
open import Function.Equivalence hiding (sym) | |
open import Function.Equality using (_⟨$⟩_) | |
step‿preserves‿halting : ∀ {Γ t} {e e′ : Tm Γ t} → e ==> e′ → Halts e ⇔ Halts e′ | |
step‿preserves‿halting {e = e} {e′ = e′} step = equivalence fwd bwd | |
where | |
fwd : Halts e → Halts e′ | |
fwd (e″ , ε , v) = ⊥-elim (value⇒normal v (, step)) | |
fwd (e″ , s ◅ steps , v) rewrite deterministic step s = e″ , steps , v | |
bwd : Halts e′ → Halts e | |
bwd (e″ , steps , v) = e″ , step ◅ steps , v | |
step‿preserves‿saturated : ∀ {t} {e e′ : Tm _ t} → e ==> e′ → Saturated e ⇔ Saturated e′ | |
step‿preserves‿saturated step = equivalence (fwd step) (bwd step) | |
where | |
fwd : ∀ {t} {e e′ : Tm _ t} → e ==> e′ → Saturated e → Saturated e′ | |
fwd {fun s t} step (halts , sat) = Equivalence.to (step‿preserves‿halting step) ⟨$⟩ halts , λ e → fwd (appˡ step _) (sat e) | |
bwd : ∀ {t} {e e′ : Tm _ t} → e ==> e′ → Saturated e′ → Saturated e | |
bwd {fun s t} step (halts , sat) = Equivalence.from (step‿preserves‿halting step) ⟨$⟩ halts , λ e → bwd (appˡ step _) (sat e) | |
step*‿preserves‿saturated : ∀ {t} {e e′ : Tm _ t} → e ==>* e′ → Saturated e ⇔ Saturated e′ | |
step*‿preserves‿saturated ε = id | |
step*‿preserves‿saturated (step ◅ steps) = step*‿preserves‿saturated steps ∘ step‿preserves‿saturated step | |
data Instantiation : ∀ Γ → Set where | |
[] : Instantiation [] | |
_▷_ : ∀ {Γ t} → Instantiation Γ → Σ (Tm [] t) (λ e → Value e × Saturated e) → Instantiation (Γ ▷ t) | |
inst : ∀ {Γ} → Instantiation Γ → [] ⊢⋆ Γ | |
inst [] () | |
inst (env ▷ (e , _ , _)) vz = e | |
inst (env ▷ _) (vs x) = inst env x | |
extend-env : ∀ {Γ t u } (e′ : Tm [] t ) {vs : Value e′ × Saturated e′} (env : Instantiation Γ) (x : Var u (Γ ▷ t)) → inst (env ▷ (e′ , vs)) x ≡ extend e′ (inst env) x | |
extend-env e′ env vz = refl | |
extend-env e′ env (vs x) = refl | |
saturate-var : ∀ {Γ} → (env : Instantiation Γ) → ∀ {t} (x : Var t Γ) → Saturated (sub (inst env) [] x) | |
saturate-var (_ ▷ (_ , _ , sat)) vz = sat | |
saturate-var (env ▷ _) (vs x) = saturate-var env x | |
app-lam* : ∀ {Γ t} {e e′ : Tm Γ t} → e ==>* e′ → Value e′ → ∀ {u} (f : Tm _ u) → app (lam t f) e ==>* subst (sub (push e′)) f | |
app-lam* steps v f = gmap _ (appʳ (lam _ _)) steps ◅◅ app-lam f v ◅ ε | |
-- todo11 : ∀ {Γ Δ Θ Ξ t} (ρ : Θ ⊢⋆ Ξ) (σ : Γ ⊢⋆ Δ) (e : Tm (Δ ++ Ξ) t) → subst (Γ +▷ ρ) (subst (σ ▷+ Ξ) e) ≡ subst (σ ▷▷ ρ) e | |
-- todo11 {Γ} {Δ} {Θ} {Ξ} ρ σ e = {!!} | |
-- todo21 : ∀ {t u} → (e : Tm {!!} t) (e′ : Tm [] u) → subst {!!} (subst {!!} e) ≡ subst ({!!} ▷[ e′ ]▷ {!!}) e | |
-- todo21 = {!!} | |
open import Data.Sum | |
split : ∀ {Δ t} Ξ → Var t (Δ <>< Ξ) → Tm ([] <>< Ξ) t ⊎ Var t Δ | |
split [] x = inj₂ x | |
split (t ∷ Ξ) x = {!!} | |
_><_ : ∀ {Γ Δ} → Γ ⊢⋆ Δ → (Ξ : List Ty) → (Γ <>< Ξ) ⊢⋆ (Δ <>< Ξ) | |
σ >< [] = σ | |
(σ >< (t ∷ Ξ)) x = {!!} | |
todo2-var : ∀ {Γ u t} Ξ → (σ : [] ⊢⋆ Γ) (e′ : Tm [] u) (x : Var t ((Γ ▷ u) <>< Ξ)) → | |
subst (sub (push e′ >< Ξ)) ((σ >< (u ∷ Ξ)) x) ≡ (extend e′ σ >< Ξ) x | |
todo2-var [] σ e′ vz = {!!} | |
todo2-var [] σ e′ (vs x) = {!!} | |
todo2-var (x₁ ∷ Ξ) σ e′ x = {!!} | |
todo1-var : ∀ {Γ u t} → (σ : [] ⊢⋆ Γ) (e′ : Tm [] u) (x : Var t (Γ ▷ u)) → | |
subst (sub (push e′)) (mono σ x) ≡ extend e′ σ x | |
todo1-var σ e′ vz = refl | |
todo1-var σ e′ (vs x) with σ x | |
todo1-var σ e′ (vs x) | var y = wk-refl (var y) | |
todo1-var σ e′ (vs x) | lam t e = cong (lam t) {!mono σ!} | |
todo1-var σ e′ (vs x) | app f e = {!!} | |
todo2 : ∀ {Γ Ξ u t} → (σ : [] ⊢⋆ Γ) (e′ : Tm [] u) (e : Tm ((Γ ▷ u) <>< Ξ) t) → | |
subst (sub (push e′ >< Ξ)) (subst (sub (σ >< (u ∷ Ξ))) e) ≡ subst (sub ((extend e′ σ >< Ξ))) e | |
todo2 = {!!} | |
-- todo2 : ∀ {Γ u t} (σ : [] ⊢⋆ Γ) (e′ : Tm [] u) (e : Tm (Γ ▷ u) t) → | |
-- subst (sub (push e′)) (subst (sub (mono σ)) e) ≡ subst (sub (extend e′ σ)) e | |
-- todo2 = {!!} | |
todo1 : ∀ {Γ u t} (σ : [] ⊢⋆ Γ) (e′ : Tm [] u) (e : Tm (Γ ▷ u) t) → | |
subst (sub (push e′)) (subst (sub (mono σ)) e) ≡ subst (sub (extend e′ σ)) e | |
todo1 σ e′ (var x) = todo1-var σ e′ x | |
todo1 σ e′ (lam t e) = cong (lam t) {!!} | |
todo1 σ e′ (app e e₁) = {!!} | |
saturate : ∀ {Γ} → (env : Instantiation Γ) → ∀ {t} → (e : Tm Γ t) → Saturated (subst (sub (inst env)) e) | |
saturate env (var x) = saturate-var env x | |
saturate env (app f e) with saturate env f | saturate env e | |
saturate env (app f e) | _ , sat-f | sat-e = sat-f sat-e | |
saturate {Γ} env {fun .u t} (lam u f) = value⇒halts (lam u (subst _ f)) , sat-f | |
where | |
sat-f : ∀ {e : Tm _ u} → Saturated e → Saturated (app (lam u (subst _ f)) e) | |
sat-f {e} sat-e@((e′ , steps , v) , _) = Equivalence.from (step*‿preserves‿saturated f==>*f′) ⟨$⟩ sat-f′ | |
where | |
sat-e′ : Saturated e′ | |
sat-e′ = Equivalence.to (step*‿preserves‿saturated steps) ⟨$⟩ sat-e | |
f′ = subst (sub (inst (env ▷ (e′ , v , sat-e′)))) f | |
sat-f′ : Saturated f′ | |
sat-f′ = saturate (env ▷ (e′ , v , sat-e′)) f | |
lemma : subst (sub (push e′)) (subst (sub (mono (inst env))) f) ≡ subst (sub (inst (env ▷ (e′ , v , sat-e′)))) f | |
lemma = todo1 (inst env) e′ f ⟨ trans ⟩ {!!} | |
f==>*f′ : _ ==>* f′ | |
f==>*f′ = ≡-subst (λ f₀ → _ ==>* f₀) lemma (app-lam* steps v (subst (sub (mono (inst env))) f)) | |
normalization : ∀ {t} → (e : Tm [] t) → Halts e | |
normalization e = {!!} -- rewrite sym (subst-refl e) = saturated⇒halts (saturate [] e) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment