123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- module Proof where
- open import Prelude
- open import Lambda
- open import Subst
- open import Trans
- open import Reduction
- import Chain
- open module C = Chain _≤_ (\x -> refl-≤) (\x y z -> trans-≤)
- renaming (_===_by_ to _<≤>_by_)
- data SN {Γ : Ctx}{τ : Type}(t : Term Γ τ) : Set where
- bound : (n : Nat) ->
- ({u : Term Γ τ}(r : t ⟶β* u) -> length r ≤ n) -> SN t
- SNˢ : forall {Γ Δ} -> Terms Γ Δ -> Set
- SNˢ ts = All² SN ts
- -- Let's prove a simple lemma
- lem-SN⟶β : {Γ : Ctx}{τ : Type}{t u : Term Γ τ} ->
- SN t -> t ⟶β* u -> SN u
- lem-SN⟶β {Γ}{τ}{t}{u}(bound n cap) r = bound n \r' ->
- chain> length r'
- <≤> length r + length r' by lem-≤+L (length r)
- <≤> length (r ▹◃ r') by refl-≤' (lem-length▹◃ r r')
- <≤> n by cap (r ▹◃ r')
- qed
- lem-SN-map : {Γ Δ : Ctx}{σ τ : Type}
- (tm : Term Γ σ -> Term Δ τ) ->
- (f : {t u : Term Γ σ} -> t ⟶β u -> tm t ⟶β tm u)
- {t : Term Γ σ} -> SN (tm t) -> SN t
- lem-SN-map tm f (bound n p) = bound n \r ->
- chain> length r
- <≤> length {R = _⟶β_} (map tm f r)
- by refl-≤' (lem-length-map tm f r)
- <≤> n by p (map tm f r)
- qed
- lem-SN•L : {Γ : Ctx}{σ τ : Type}{t : Term Γ (σ ⟶ τ)}{u : Term Γ σ} ->
- SN (t • u) -> SN t
- lem-SN•L {u = u} = lem-SN-map (\v -> v • u) •⟶L
- lem-SN↑ : {Γ : Ctx}(Δ : Ctx){σ : Type}{t : Term Γ σ} ->
- SN (t ↑ Δ) -> SN t
- lem-SN↑ Δ = lem-SN-map (\v -> v ↑ Δ) (↑⟶β Δ)
- lem-SN-x : {Γ Δ : Ctx}{σ : Type}(x : Var Γ (Δ ⇒ σ))
- {ts : Terms Γ Δ} -> SNˢ ts -> SN (var x •ˢ ts)
- lem-SN-x x ∅² = bound zero red-var
- where
- red-var : forall {u} -> (r : var x ⟶β* u) -> length r ≤ 0
- red-var ()
- lem-SN-x x (_◄²_ {x = t}{xs = ts} snts snt) = {! !}
- where
- sn-xts : SN (var x •ˢ ts)
- sn-xts = lem-SN-x x snts
- infix 30 ⟦_⟧ ∋_
- ⟦_⟧ ∋_ : (τ : Type){Γ : Ctx} -> Term Γ τ -> Set
- ⟦ ι ⟧ ∋ t = SN t
- ⟦ σ ⟶ τ ⟧ ∋ t = forall {Δ}(u : Term (_ ++ Δ) σ) ->
- ⟦ σ ⟧ ∋ u -> ⟦ τ ⟧ ∋ t ↑ Δ • u
- mutual
- lem-⟦⟧⊆SN : (σ : Type){Γ : Ctx}{t : Term Γ σ} ->
- ⟦ σ ⟧ ∋ t -> SN t
- lem-⟦⟧⊆SN ι okt = okt
- lem-⟦⟧⊆SN (σ ⟶ τ) {Γ}{t} okt = lem-SN↑ (ε , σ) sn-t↑
- where
- ih : {Δ : Ctx}{u : Term Δ τ} -> ⟦ τ ⟧ ∋ u -> SN u
- ih = lem-⟦⟧⊆SN τ
- sn• : (Δ : Ctx)(u : Term (Γ ++ Δ) σ) -> ⟦ σ ⟧ ∋ u -> SN (t ↑ Δ • u)
- sn• Δ u h = ih (okt {Δ} u h)
- sn-t↑ : SN (wk t)
- sn-t↑ = lem-SN•L (sn• (ε , σ) vz (lem-⟦⟧ˣ σ vzero ∅²))
- lem-⟦⟧ˣ : (σ : Type){Γ Δ : Ctx}(x : Var Γ (Δ ⇒ σ)){ts : Terms Γ Δ} ->
- SNˢ ts -> ⟦ σ ⟧ ∋ var x •ˢ ts
- lem-⟦⟧ˣ ι x snts = lem-SN-x x snts
- lem-⟦⟧ˣ (σ ⟶ τ) {Γ}{Δ} x {ts} snts = \u oku -> {! !}
- where
- snts↑ : (Δ : Ctx) -> SNˢ (ts ↑ˢ Δ)
- snts↑ Δ = {! !}
- rem : (Δ : Ctx)(u : Term (Γ ++ Δ) σ) ->
- ⟦ σ ⟧ ∋ u -> ⟦ τ ⟧ ∋ var (x ↑ˣ Δ) •ˢ ts ↑ˢ Δ • u
- rem Δ u oku = lem-⟦⟧ˣ τ (x ↑ˣ Δ) (snts↑ Δ ◄² lem-⟦⟧⊆SN σ oku)
- lem-⟦⟧subst : {Γ Δ : Ctx}{τ : Type}(σ : Type)
- {t : Term (Γ , τ) (Δ ⇒ σ)}{u : Term Γ τ}{vs : Terms Γ Δ} ->
- ⟦ σ ⟧ ∋ (t / [ u ]) •ˢ vs -> ⟦ σ ⟧ ∋ (ƛ t) • u •ˢ vs
- lem-⟦⟧subst ι h = {!h !}
- lem-⟦⟧subst (σ₁ ⟶ σ₂) h = {! !}
|