module Implicit.Interm2Algo.Find where
open import Implicit.Language.All
open import Implicit.Interm2Algo.ExtIrrev
⊆/c-find : Γ ⊆ Δ w/t A w/c j
→ Γ ∋^ k
→ Δ ∋= k
→ find A k j
⊆/c-find (⊆Z regΓ) in1 in2 = ⊥-elim (∋^-∋=-false in1 in2)
⊆/c-find (⊆∞ ext) in1 in2 = f-□ (^in-=out-ε ext in1 in2)
⊆/c-find {A = A `→ B} {k = k} (⊆I ext ext₁) in1 in2 with ε-dec {k = k} {A}
... | inj₁ p = f-arr-l p
... | inj₂ ¬p = f-arr-r ¬p (⊆/c-find ext₁ (⊆/-^in-^out ext ¬p in1) in2)
⊆/c-find (⊆C cloA ext) in1 in2 = f-arr-r (⊢c-^∈-¬ε cloA in1) (⊆/c-find ext in1 in2)
⊆/c-find (⊆∀ ext ) in1 in2 = f-∀ (⊆/c-find ext (S^ in1) (S= in2))
⊆/c-find (⊆∀-no ext ) in1 in2 = f-∀ (⊆/c-find ext (S^ in1) (S^ in2))
⊆/c-find (⊆X regΓ cloA) in1 in2 = ⊥-elim (∋^-∋=-false in1 in2)
⊆/c-find (⊆Inf-X extx iso) in1 in2
with ε-var ← ^in-=out-ε (ext-var extx) in1 in2 = f-iso iso
⊆/c-find0 : Γ ,^ ⊆ Δ ,= B w/t A w/c j
→ find A #0 j
⊆/c-find0 ext = ⊆/c-find ext Z Z
⊆/c-find-∋= : Γ ⊆ Δ w/t A w/c j
→ Γ ∋^ k
→ find A k j
→ Δ ∋= k
⊆/c-find-∋= (⊆∞ ext) inΓ (f-□ x) = ⊆/-^in-=out ext x inΓ
⊆/c-find-∋= (⊆I ext ext₁) inΓ (f-arr-l x) = ⊆-∋= (⊆/-^in-=out ext x inΓ) (⊆/c-⊆ ext₁)
⊆/c-find-∋= (⊆I ext ext₁) inΓ (f-arr-r ¬inA fd) = ⊆/c-find-∋= ext₁ (⊆/-^in-^out ext ¬inA inΓ) fd
⊆/c-find-∋= (⊆C cloA ext) inΓ (f-arr-r ¬inA fd) = ⊆/c-find-∋= ext inΓ fd
⊆/c-find-∋= (⊆∀ ext ) inΓ (f-∀ fd)
with S= r ← ⊆/c-find-∋= ext (S^ inΓ) fd = r
⊆/c-find-∋= (⊆∀-no ext ) inΓ (f-∀ fd)
with S^ r ← ⊆/c-find-∋= ext (S^ inΓ) fd = r
⊆/c-find-∋= (⊆X regΓ cloA) inΓ (f-iso iso) = ⊥-elim (⊢c-^∈-false ε-var inΓ cloA)
⊆/c-find-∋= (⊆Inf-X extx iso₁) inΓ (f-iso iso) = ⊆/x-^in-=out extx inΓ