Agda-2.3.2.2: examples/outdated-and-incorrect/tait/Proof.agda
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 = {! !}