module Implicit.Language.Find.Properties where

open import Implicit.Language.Base
open import Implicit.Language.Shift.All
open import Implicit.Language.Occur.All
open import Implicit.Language.Find.Base

↑ty-find : find A X j
          A ↑ty k  A'
          X #< k
          find A' (inject₁ X) j
↑ty-find (f-□ inA) upA lt = f-□ (↑ty-ε inA upA lt)
↑ty-find (f-iso iso) ↑ty-var lt rewrite punchIn-inject lt = f-iso iso
↑ty-find (f-arr-l inA) (↑ty-arr upA upA₁) lt = f-arr-l (↑ty-ε inA upA lt)
↑ty-find (f-arr-r ¬inA fd) (↑ty-arr upA upA₁) lt = f-arr-r (↑ty-¬ε-prv ¬inA upA lt) (↑ty-find fd upA₁ lt)
↑ty-find (f-∀ fd) (↑ty-∀ upA) lt = f-∀ (↑ty-find fd upA (s≤s lt))

↑ty-find0 : find A #0 j
           A ↑ty (#S k)  A'
           find A' #0 j
↑ty-find0 fd upA = ↑ty-find fd upA (s≤s z≤n)


↑ty-find' : find A' (inject₁ X) j
           A ↑ty k  A'
           X #< k
           find A X j
↑ty-find' (f-□ inA) upA lt = f-□ (↑ty-ε' inA lt upA)
↑ty-find' (f-iso iso) upA lt rewrite punchIn-inject lt with ↑ty-var-inv-helper upA refl
... | refl = f-iso iso
↑ty-find' (f-arr-l inA) (↑ty-arr upA upA₁) lt = f-arr-l (↑ty-ε' inA lt upA)
↑ty-find' (f-arr-r ¬inA fd) (↑ty-arr upA upA₁) lt = f-arr-r (¬ε-↑ty'-inv ¬inA upA lt) (↑ty-find' fd upA₁ lt)
↑ty-find' (f-∀ fd) (↑ty-∀ upA) lt = f-∀ (↑ty-find' fd upA (s≤s lt))

↑ty-find0' : find A' #0 j
             A ↑ty (#S k)  A'
             find A #0 j
↑ty-find0' fd upA = ↑ty-find' fd upA (s≤s z≤n)


find-ε-gen : find A k j
            k ε A
find-ε-gen (f-□ inA) = inA
find-ε-gen (f-iso iso) = ε-var
find-ε-gen (f-arr-l inA) = ε-arr-l inA
find-ε-gen (f-arr-r ¬inA fd) = ε-arr-r ¬inA (find-ε-gen fd)
find-ε-gen (f-∀ fd) = ε-∀ (find-ε-gen fd)