module A201605.AbelChapmanExtended2.RenamingLemmas.Normalization2 where open import Function using (_∘_) open import Relation.Binary.PropositionalEquality using (sym ; cong) open import A201605.AbelChapmanExtended.Delay open import A201605.AbelChapmanExtended.StrongBisimilarity open import A201605.AbelChapmanExtended2.Syntax open import A201605.AbelChapmanExtended2.OPE open import A201605.AbelChapmanExtended2.Renaming open import A201605.AbelChapmanExtended2.Normalization open import A201605.AbelChapmanExtended2.RenamingLemmas.OPE open import A201605.AbelChapmanExtended2.RenamingLemmas.Normalization1 mutual ren-readback : ∀ {i Δ Δ′} {a : Ty} (η : Δ′ ⊇ Δ) (v : Val Δ a) → ren-nf η <$> readback v ≈⟨ i ⟩≈ readback (ren-val η v) ren-readback {a = ⊥} η (ne v) = proof ren-nf η <$> (ne <$> readback-ne v) ≈⟨ ⋘ readback-ne v ⟩ (ren-nf η ∘ ne) <$> readback-ne v ≡⟨⟩ (ne ∘ ren-nen η) <$> readback-ne v ≈⟨ ⋙ readback-ne v ⟩ ne <$> (ren-nen η <$> readback-ne v) ≈⟨ ∵ ren-readback-ne η v ⟩ ne <$> readback-ne (ren-nev η v) ∎ where open ≈-Reasoning ren-readback {a = a ∨ b} η (ne v) = proof ren-nf η <$> (ne <$> readback-ne v) ≈⟨ ⋘ readback-ne v ⟩ (ren-nf η ∘ ne) <$> readback-ne v ≡⟨⟩ (ne ∘ ren-nen η) <$> readback-ne v ≈⟨ ⋙ readback-ne v ⟩ ne <$> (ren-nen η <$> readback-ne v) ≈⟨ ∵ ren-readback-ne η v ⟩ ne <$> readback-ne (ren-nev η v) ∎ where open ≈-Reasoning ren-readback {a = a ∨ b} η (inl v) = proof ren-nf η <$> (inl <$> readback v) ≈⟨ ⋘ readback v ⟩ (ren-nf η ∘ inl) <$> readback v ≡⟨⟩ (inl ∘ ren-nf η) <$> readback v ≈⟨ ⋙ readback v ⟩ inl <$> (ren-nf η <$> readback v) ≈⟨ ∵ ren-readback η v ⟩ inl <$> readback (ren-val η v) ∎ where open ≈-Reasoning ren-readback {a = a ∨ b} η (inr v) = proof ren-nf η <$> (inr <$> readback v) ≈⟨ ⋘ readback v ⟩ (ren-nf η ∘ inr) <$> readback v ≡⟨⟩ (inr ∘ ren-nf η) <$> readback v ≈⟨ ⋙ readback v ⟩ inr <$> (ren-nf η <$> readback v) ≈⟨ ∵ ren-readback η v ⟩ inr <$> readback (ren-val η v) ∎ where open ≈-Reasoning ren-readback {a = a ⇒ b} η v = ≈later (ren-∞η-expand η v) ren-readback {a = a ∧ b} η v = ≈later (ren-∞ψ-expand η v) ren-readback {a = ⊤} η v = ≈now unit ren-readback-ne : ∀ {i Δ Δ′ a} (η : Δ′ ⊇ Δ) (v : Ne Val Δ a) → ren-nen η <$> readback-ne v ≈⟨ i ⟩≈ readback-ne (ren-nev η v) ren-readback-ne η (boom v) = proof ren-nen η <$> (n ← readback-ne v ⁏ now (boom n)) ≈⟨ ⋘ readback-ne v ⟩ n ← readback-ne v ⁏ ren-nen η <$> now (boom n) ≡⟨⟩ n ← readback-ne v ⁏ now (boom (ren-nen η n)) ≈⟨ ⋙ readback-ne v ⟩ n′ ← ren-nen η <$> readback-ne v ⁏ now (boom n′) ≈⟨ ∵ ren-readback-ne η v ⟩ n′ ← readback-ne (ren-nev η v) ⁏ now (boom n′) ∎ where open ≈-Reasoning ren-readback-ne η (case v wl wr) = proof ren-nen η <$> (n ← readback-ne v ⁏ ml ← readback wl ⁏ mr ← readback wr ⁏ now (case n ml mr)) ≈⟨ ⋘ readback-ne v ⟩ n ← readback-ne v ⁏ ren-nen η <$> (ml ← readback wl ⁏ mr ← readback wr ⁏ now (case n ml mr)) ≈⟨ n ⇚ readback-ne v ⁏ ⋘ readback wl ⟩ n ← readback-ne v ⁏ ml ← readback wl ⁏ ren-nen η <$> (mr ← readback wr ⁏ now (case n ml mr)) ≈⟨ n ⇚ readback-ne v ⁏ ml ⇚ readback wl ⁏ ⋘ readback wr ⟩ n ← readback-ne v ⁏ ml ← readback wl ⁏ mr ← readback wr ⁏ ren-nen η <$> now (case n ml mr) ≈⟨ n ⇚ readback-ne v ⁏ ml ⇚ readback wl ⁏ mr ⇚ readback wr ⁏ ≈now (case (ren-nen η n) (ren-nf (lift η) ml) (ren-nf (lift η) mr)) ⟩ n ← readback-ne v ⁏ ml ← readback wl ⁏ mr ← readback wr ⁏ now (case (ren-nen η n) (ren-nf (lift η) ml) (ren-nf (lift η) mr)) ≈⟨ n ⇚ readback-ne v ⁏ ml ⇚ readback wl ⁏ ⋙ readback wr ⟩ n ← readback-ne v ⁏ ml ← readback wl ⁏ mr′ ← ren-nf (lift η) <$> readback wr ⁏ now (case (ren-nen η n) (ren-nf (lift η) ml) mr′) ≈⟨ n ⇚ readback-ne v ⁏ ml ⇚ readback wl ⁏ ∵ ren-readback (lift η) wr ⟩ n ← readback-ne v ⁏ ml ← readback wl ⁏ mr′ ← readback (ren-val (lift η) wr) ⁏ now (case (ren-nen η n) (ren-nf (lift η) ml) mr′) ≈⟨ n ⇚ readback-ne v ⁏ ⋙ readback wl ⟩ n ← readback-ne v ⁏ ml′ ← ren-nf (lift η) <$> readback wl ⁏ mr′ ← readback (ren-val (lift η) wr) ⁏ now (case (ren-nen η n) ml′ mr′) ≈⟨ n ⇚ readback-ne v ⁏ ∵ ren-readback (lift η) wl ⟩ n ← readback-ne v ⁏ ml′ ← readback (ren-val (lift η) wl) ⁏ mr′ ← readback (ren-val (lift η) wr) ⁏ now (case (ren-nen η n) ml′ mr′) ≈⟨ ⋙ readback-ne v ⟩ n′ ← ren-nen η <$> readback-ne v ⁏ ml′ ← readback (ren-val (lift η) wl) ⁏ mr′ ← readback (ren-val (lift η) wr) ⁏ now (case n′ ml′ mr′) ≈⟨ ∵ ren-readback-ne η v ⟩ n′ ← readback-ne (ren-nev η v) ⁏ ml′ ← readback (ren-val (lift η) wl) ⁏ mr′ ← readback (ren-val (lift η) wr) ⁏ now (case n′ ml′ mr′) ∎ where open ≈-Reasoning ren-readback-ne η (var x) = ≈now (var (ren-var η x)) ren-readback-ne η (app v w) = proof ren-nen η <$> (n ← readback-ne v ⁏ m ← readback w ⁏ now (app n m)) ≈⟨ ⋘ readback-ne v ⟩ n ← readback-ne v ⁏ ren-nen η <$> (m ← readback w ⁏ now (app n m)) ≈⟨ n ⇚ readback-ne v ⁏ ⋘ readback w ⟩ n ← readback-ne v ⁏ m ← readback w ⁏ ren-nen η <$> now (app n m) ≡⟨⟩ n ← readback-ne v ⁏ m ← readback w ⁏ now (app (ren-nen η n) (ren-nf η m)) ≈⟨ n ⇚ readback-ne v ⁏ ⋙ readback w ⟩ n ← readback-ne v ⁏ m′ ← ren-nf η <$> readback w ⁏ now (app (ren-nen η n) m′) ≈⟨ ⋙ readback-ne v ⟩ n′ ← ren-nen η <$> readback-ne v ⁏ m′ ← ren-nf η <$> readback w ⁏ now (app n′ m′) ≈⟨ n′ ⇚ ren-nen η <$> readback-ne v ⁏ ∵ ren-readback η w ⟩ n′ ← ren-nen η <$> readback-ne v ⁏ m′ ← readback (ren-val η w) ⁏ now (app n′ m′) ≈⟨ ∵ ren-readback-ne η v ⟩ n′ ← readback-ne (ren-nev η v) ⁏ m′ ← readback (ren-val η w) ⁏ now (app n′ m′) ∎ where open ≈-Reasoning ren-readback-ne η (fst v) = proof ren-nen η <$> (n ← readback-ne v ⁏ now (fst n)) ≈⟨ ⋘ readback-ne v ⟩ n ← readback-ne v ⁏ ren-nen η <$> now (fst n) ≡⟨⟩ n ← readback-ne v ⁏ now (fst (ren-nen η n)) ≈⟨ ⋙ readback-ne v ⟩ n′ ← ren-nen η <$> readback-ne v ⁏ now (fst n′) ≈⟨ ∵ ren-readback-ne η v ⟩ n′ ← readback-ne (ren-nev η v) ⁏ now (fst n′) ∎ where open ≈-Reasoning ren-readback-ne η (snd v) = proof ren-nen η <$> (n ← readback-ne v ⁏ now (snd n)) ≈⟨ ⋘ readback-ne v ⟩ n ← readback-ne v ⁏ ren-nen η <$> now (snd n) ≡⟨⟩ n ← readback-ne v ⁏ now (snd (ren-nen η n)) ≈⟨ ⋙ readback-ne v ⟩ n′ ← ren-nen η <$> readback-ne v ⁏ now (snd n′) ≈⟨ ∵ ren-readback-ne η v ⟩ n′ ← readback-ne (ren-nev η v) ⁏ now (snd n′) ∎ where open ≈-Reasoning ren-∞η-expand : ∀ {i Δ Δ′ a b} (η : Δ′ ⊇ Δ) (v : Val Δ (a ⇒ b)) → ren-nf η ∞<$> ∞η-expand v ∞≈⟨ i ⟩≈ ∞η-expand (ren-val η v) ≈force (ren-∞η-expand η v) = proof ren-nf η <$> (v′ ← β-reduce (wk-val v) nev₀ ⁏ n′ ← readback v′ ⁏ now (lam n′)) ≈⟨ ⋘ β-reduce (wk-val v) nev₀ ⟩ v′ ← β-reduce (wk-val v) nev₀ ⁏ ren-nf η <$> (n′ ← readback v′ ⁏ now (lam n′)) ≈⟨ v′ ⇚ β-reduce (wk-val v) nev₀ ⁏ ⋘ readback v′ ⟩ v′ ← β-reduce (wk-val v) nev₀ ⁏ n′ ← readback v′ ⁏ ren-nf η <$> now (lam n′) ≈⟨ v′ ⇚ β-reduce (wk-val v) nev₀ ⁏ n′ ⇚ readback v′ ⁏ ≈now (lam (ren-nf (lift η) n′)) ⟩ v′ ← β-reduce (wk-val v) nev₀ ⁏ n′ ← readback v′ ⁏ n″ ← now (ren-nf (lift η) n′) ⁏ now (lam n″) ≈⟨ v′ ⇚ β-reduce (wk-val v) nev₀ ⁏ ⋙ readback v′ ⟩ v′ ← β-reduce (wk-val v) nev₀ ⁏ n″ ← ren-nf (lift η) <$> readback v′ ⁏ now (lam n″) ≈⟨ v′ ⇚ β-reduce (wk-val v) nev₀ ⁏ ∵ ren-readback (lift η) v′ ⟩ v′ ← β-reduce (wk-val v) nev₀ ⁏ n″ ← readback (ren-val (lift η) v′) ⁏ now (lam n″) ≈⟨ ⋙ β-reduce (wk-val v) nev₀ ⟩ v″ ← ren-val (lift η) <$> β-reduce (wk-val v) nev₀ ⁏ n″ ← readback v″ ⁏ now (lam n″) ≈⟨ ∵ ren-β-reduce (lift η) (wk-val v) nev₀ ⟩ v″ ← β-reduce (ren-val (lift η) (wk-val v)) nev₀ ⁏ n″ ← readback v″ ⁏ now (lam n″) ≡⟨ cong (λ v → (v′ ← β-reduce v nev₀ ⁏ n′ ← readback v′ ⁏ now (lam n′))) (ren-val-• (lift η) wk v) ⟩ v″ ← β-reduce (ren-val (weak (η • id)) v) nev₀ ⁏ n″ ← readback v″ ⁏ now (lam n″) ≡⟨ cong (λ η′ → (v′ ← β-reduce (ren-val (weak η′) v) nev₀ ⁏ n′ ← readback v′ ⁏ now (lam n′))) (η•id η) ⟩ v″ ← β-reduce (ren-val (weak η) v) nev₀ ⁏ n″ ← readback v″ ⁏ now (lam n″) ≡⟨ cong (λ η′ → (v′ ← β-reduce (ren-val (weak η′) v) nev₀ ⁏ n′ ← readback v′ ⁏ now (lam n′))) (sym (id•η η)) ⟩ v″ ← β-reduce (ren-val (weak (id • η)) v) nev₀ ⁏ n″ ← readback v″ ⁏ now (lam n″) ≡⟨ cong (λ v → (v′ ← β-reduce v nev₀ ⁏ n′ ← readback v′ ⁏ now (lam n′))) (sym (ren-val-• wk η v)) ⟩ v″ ← β-reduce (wk-val (ren-val η v)) nev₀ ⁏ n″ ← readback v″ ⁏ now (lam n″) ∎ where open ≈-Reasoning ren-∞ψ-expand : ∀ {i Δ Δ′ a b} (η : Δ′ ⊇ Δ) (v : Val Δ (a ∧ b)) → ren-nf η ∞<$> ∞ψ-expand v ∞≈⟨ i ⟩≈ ∞ψ-expand (ren-val η v) ≈force (ren-∞ψ-expand η v) = proof ren-nf η <$> (v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n′ ← readback v′ ⁏ m′ ← readback w′ ⁏ now (pair n′ m′)) ≈⟨ ⋘ π₁-reduce v ⟩ v′ ← π₁-reduce v ⁏ ren-nf η <$> (w′ ← π₂-reduce v ⁏ n′ ← readback v′ ⁏ m′ ← readback w′ ⁏ now (pair n′ m′)) ≈⟨ v′ ⇚ π₁-reduce v ⁏ ⋘ π₂-reduce v ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ ren-nf η <$> (n′ ← readback v′ ⁏ m′ ← readback w′ ⁏ now (pair n′ m′)) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ ⋘ readback v′ ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n′ ← readback v′ ⁏ ren-nf η <$> (m′ ← readback w′ ⁏ now (pair n′ m′)) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ n′ ⇚ readback v′ ⁏ ⋘ readback w′ ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n′ ← readback v′ ⁏ m′ ← readback w′ ⁏ ren-nf η <$> now (pair n′ m′) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ n′ ⇚ readback v′ ⁏ m′ ⇚ readback w′ ⁏ ≈now (pair (ren-nf η n′) (ren-nf η m′)) ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n′ ← readback v′ ⁏ m′ ← readback w′ ⁏ now (pair (ren-nf η n′) (ren-nf η m′)) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ n′ ⇚ readback v′ ⁏ ⋙ readback w′ ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n′ ← readback v′ ⁏ m″ ← ren-nf η <$> readback w′ ⁏ now (pair (ren-nf η n′) m″) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ ⋙ readback v′ ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n″ ← ren-nf η <$> readback v′ ⁏ m″ ← ren-nf η <$> readback w′ ⁏ now (pair n″ m″) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ n″ ⇚ ren-nf η <$> readback v′ ⁏ ∵ ren-readback η w′ ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n″ ← ren-nf η <$> readback v′ ⁏ m″ ← readback (ren-val η w′) ⁏ now (pair n″ m″) ≈⟨ v′ ⇚ π₁-reduce v ⁏ w′ ⇚ π₂-reduce v ⁏ ∵ ren-readback η v′ ⟩ v′ ← π₁-reduce v ⁏ w′ ← π₂-reduce v ⁏ n″ ← readback (ren-val η v′) ⁏ m″ ← readback (ren-val η w′) ⁏ now (pair n″ m″) ≈⟨ v′ ⇚ (π₁-reduce v) ⁏ ⋙ π₂-reduce v ⟩ v′ ← π₁-reduce v ⁏ w″ ← ren-val η <$> π₂-reduce v ⁏ n″ ← readback (ren-val η v′) ⁏ m″ ← readback w″ ⁏ now (pair n″ m″) ≈⟨ ⋙ π₁-reduce v ⟩ v″ ← ren-val η <$> π₁-reduce v ⁏ w″ ← ren-val η <$> π₂-reduce v ⁏ n″ ← readback v″ ⁏ m″ ← readback w″ ⁏ now (pair n″ m″) ≈⟨ v″ ⇚ ren-val η <$> π₁-reduce v ⁏ ∵ ren-π₂-reduce η v ⟩ v″ ← ren-val η <$> π₁-reduce v ⁏ w″ ← π₂-reduce (ren-val η v) ⁏ n″ ← readback v″ ⁏ m″ ← readback w″ ⁏ now (pair n″ m″) ≈⟨ ∵ ren-π₁-reduce η v ⟩ v″ ← π₁-reduce (ren-val η v) ⁏ w″ ← π₂-reduce (ren-val η v) ⁏ n″ ← readback v″ ⁏ m″ ← readback w″ ⁏ now (pair n″ m″) ∎ where open ≈-Reasoning