module A201802.WIP.LR-scratch where -------------------------------------------------------------------------------- {- -- Value non-reduction. vnr : ∀ {g} → {M : Val g} {M′ : Term g} → ¬ (Val.term M ↦ M′) vnr {M = val (LAM M) {{iv-LAM}}} M↦M′ = {!!} vnr {M = val TRUE {{iv-TRUE}}} M↦M′ = {!!} vnr {M = val FALSE {{iv-FALSE}}} M↦M′ = {!!} -- Determinism. uniq↦ : ∀ {g} → {M M′₁ M′₂ : Term g} → M ↦ M′₁ → M ↦ M′₂ → M′₁ ≡ M′₂ uniq↦ red-APP-LAM M↦M′₂ = {!!} uniq↦ red-IF-TRUE M↦M′₂ = {!!} uniq↦ red-IF-FALSE M↦M′₂ = {!!} uniq↦ (red-cong E M↦M′₁) M↦M′₂ = {!!} uniq⤅ : ∀ {g} → {M M′₁ M′₂ : Term g} → M ⤅ M′₁ → M ⤅ M′₂ → M′₁ ≡ M′₂ uniq⤅ done done = refl uniq⤅ done (step M↦M″₂ M″₂⤅M′₂) = {!!} uniq⤅ (step M↦M″₁ M″₁⤅M′₁) done = {!!} uniq⤅ (step M↦M″₁ M″₁⤅M′₁) (step M↦M″₂ M″₂⤅M′₂) = {!!} -} -- foo : ∀ {g} → {M M′ : Term g} -- → M ⤅ M′ -- → M ≡ M′ ⊎ Σ (Term g) (\ M″ → M ↦ M″ × M″ ⤅ M′) -- foo done = inj₁ refl -- foo (step M↦M″ M″⤅M′) = inj₂ (_ , (M↦M″ , M″⤅M′)) -- inj-VAR : ∀ {g} → {I₁ I₂ : Fin g} -- → VAR I₁ ≡ VAR I₂ -- → I₁ ≡ I₂ -- inj-VAR refl = refl -- inj-LAM : ∀ {g} → {M₁ M₂ : Term (suc g)} -- → LAM M₁ ≡ LAM M₂ -- → M₁ ≡ M₂ -- inj-LAM refl = refl -- inj-APP₁ : ∀ {g} → {M₁ M₂ N : Term g} -- → APP M₁ N ≡ APP M₂ N -- → M₁ ≡ M₂ -- inj-APP₁ refl = refl -- inj-APP₂ : ∀ {g} → {M N₁ N₂ : Term g} -- → APP M N₁ ≡ APP M N₂ -- → N₁ ≡ N₂ -- inj-APP₂ refl = refl -- inj-IF₁ : ∀ {g} → {M₁ M₂ N O : Term g} -- → IF M₁ N O ≡ IF M₂ N O -- → M₁ ≡ M₂ -- inj-IF₁ refl = refl -- inj-IF₂ : ∀ {g} → {M N₁ N₂ O : Term g} -- → IF M N₁ O ≡ IF M N₂ O -- → N₁ ≡ N₂ -- inj-IF₂ refl = refl -- inj-IF₃ : ∀ {g} → {M N O₁ O₂ : Term g} -- → IF M N O₁ ≡ IF M N O₂ -- → O₁ ≡ O₂ -- inj-IF₃ refl = refl -- inj[]₁ : ∀ {g} → {E₁ E₂ : EvCx g} {M : Term g} -- → E₁ [ M ] ≡ E₂ [ M ] -- → E₁ ≡ E₂ -- inj[]₁ {E₁ = E₁} {E₂} p = {!!} -- inj[]₂ : ∀ {g} → {M₁ M₂ : Term g} -- → (E : EvCx g) → E [ M₁ ] ≡ E [ M₂ ] -- → M₁ ≡ M₂ -- inj[]₂ ec-[] refl = refl -- inj[]₂ (ec-fun-APP E N) p = inj[]₂ E (inj-APP₁ p) -- inj[]₂ (ec-APP-arg M E) p = inj[]₂ E (inj-APP₂ p) -- inj[]₂ (ec-IF E N O) p = inj[]₂ E (inj-IF₁ p) -- uniq[] : ∀ {g} → {M M′₁ M′₂ : Term g} -- → (E : EvCx g) → E [ M ] ≡ M′₁ → E [ M ] ≡ M′₂ -- → M′₁ ≡ M′₂ -- uniq[] E refl refl = refl -- uniq↦ : ∀ {g} → {M M′₁ M′₂ : Term g} -- → M ↦ M′₁ → M ↦ M′₂ -- → M′₁ ≡ M′₂ -- uniq↦ (red-APP-LAM {{refl}}) (red-APP-LAM {{refl}}) = refl -- uniq↦ red-IF-TRUE red-IF-TRUE = refl -- uniq↦ red-IF-FALSE red-IF-FALSE = refl -- uniq↦ (red-cong E₁ M↦M′₁ {{p₁}} {{refl}}) (red-APP-LAM {{refl}}) = {!!} -- uniq↦ (red-cong E₁ M↦M′₁ {{p₁}} {{refl}}) red-IF-TRUE = {!!} -- uniq↦ (red-cong E₁ M↦M′₁ {{p₁}} {{refl}}) red-IF-FALSE = {!!} -- uniq↦ (red-APP-LAM {{refl}}) (red-cong E₂ M↦M′₂ {{p₂}} {{refl}}) = {!!} -- uniq↦ red-IF-TRUE (red-cong E₂ M↦M′₂ {{p₂}} {{refl}}) = {!!} -- uniq↦ red-IF-FALSE (red-cong E₂ M↦M′₂ {{p₂}} {{refl}}) = {!!} -- uniq↦ (red-cong E₁ M↦M′₁ {{p₁}} {{refl}}) (red-cong E₂ M↦M′₂ {{p₂}} {{refl}}) = {!uniq↦ M↦M′₁ M↦M′₂!} -- bar : ∀ {g} → {M M′ M″ : Term g} -- → M ↦ M′ → M ⤅ M″ → {{_ : ¬ (M ≡ M″)}} -- → M′ ⤅ M″ -- bar M↦M′ done {{p}} = refl ↯ p -- bar M↦M′ (step M↦M° M°⤅M″) = {!!} -- oops : ∀ {g} → {M M′ M″ : Term g} -- → M ↦ M′ → M ⤅ M″ -- → M′ ⤅ M″ -- oops M↦M′ done = {!!} -- oops M↦M′ (step M↦M° M°⤅M″) = {!!} -- -------------------------------------------------------------------------------- -- red-cong-APP-LAM : ∀ {g} → {M N N′ : Term g} {M′ : Term (suc g)} -- → M ⤅ LAM M′ → N ⤅ N′ -- → APP (LAM M′) N ⤅ CUT N′ M′ -- red-cong-APP-LAM M⤅LAM-M′ N⤅N′ = {!!} -- halt-APP : ∀ {g} → {M N : Term g} {M′ : Term (suc g)} -- → M ⤅ LAM M′ → M′ ⇓ → N ⇓ -- → APP M N ⇓ -- halt-APP M⤅LAM-M′ M′⇓ N⇓ = {!!} -- -- SNs : ∀ {g} → Vals 0 g → Types g → Set -- -- SNs (vals ∙) ∙ = ⊤ -- -- SNs (vals (τ , M) {{av-τ , iv-M}}) (Γ , A) = SNs (vals τ {{av-τ}}) Γ × SN M A -- -- derps : ∀ {g} → {τ : Vals 0 g} {Γ : Types g} -- -- → SNs τ Γ -- -- → ∙ ⊢ Vals.terms τ ⦂ Γ all -- -- derps {τ = vals ∙} {∙} ∙ = ∙ -- -- derps {τ = vals (τ , M) {{av-τ , iv-M}}} {Γ , A} (σ , s) = derps σ , derp s -- -- tp-SUB : ∀ {g M A} → {τ : Vals 0 g} {Γ : Types g} -- -- → SNs τ Γ → Γ ⊢ M ⦂ A -- -- → ∙ ⊢ SUB (Vals.terms τ) M ⦂ A -- -- tp-SUB σ 𝒟 = sub (derps σ) 𝒟 -- -- sn-lem₁ : ∀ {A M M′} → M ↦ M′ → ∙ ⊢ M ⦂ A → SN M′ A -- -- → SN M A -- -- sn-lem₁ {𝔹} M↦M′ 𝒟 (𝒟′ , (M″ , M′⤅M″)) = 𝒟 , (M″ , step M↦M′ M′⤅M″) -- -- sn-lem₁ {A ⊃ B} M↦M′ 𝒟 (𝒟′ , (M″ , M′⤅M″) , f) = -- -- 𝒟 , (M″ , step M↦M′ M′⤅M″) , (\ s → sn-lem₁ (red-cong (ec-fun-APP ec-[] _) M↦M′) -- -- (app 𝒟 (derp s)) (f s)) -- -- sn-lem₂ : ∀ {A M M′} → M ↦ M′ → ∙ ⊢ M ⦂ A → SN M A -- -- → SN M′ A -- -- sn-lem₂ {𝔹} M↦M′ 𝒟 (_ , (M″ , M⤅M″)) = {!!} -- -- sn-lem₂ {A ⊃ B} M↦M′ 𝒟 (_ , (M″ , M⤅M″) , f) = {!!} -- -- sn-SUB : ∀ {g M A} → {τ : Vals 0 g} {Γ : Types g} -- -- → SNs τ Γ → Γ ⊢ M ⦂ A -- -- → SN (SUB (Vals.terms τ) M) A -- -- sn-SUB σ (var i) = {!!} -- -- sn-SUB σ (lam 𝒟) = {!!} -- -- sn-SUB σ (app 𝒟 ℰ) = {!!} -- -- sn-SUB σ true = true , (val TRUE , done) -- -- sn-SUB σ false = false , (val FALSE , done) -- -- sn-SUB σ (if 𝒟 ℰ ℱ) = {!!} -- -- --------------------------------------------------------------------------------