module Implicit.Language.Find.Base where
open import Implicit.Language.Base
open import Implicit.Language.Shift.All
open import Implicit.Language.Lookup.Base
open import Implicit.Language.Occur.Base
open import Implicit.Language.Regular.Base
data □like : Mask → Set where
□like-Z : □like (□ · `□)
□like-S : □like j
→ □like (□ · j)
data find : Type m → Fin m → Mask → Set where
f-□ : (inA : k ε A)
→ find A k `□
f-iso : (iso : □like j)
→ find (‶ k) k j
f-arr-l : (inA : k ε A)
→ find (A `→ B) k (□ · j)
f-arr-r : (¬inA : k ¬ε A)
→ find B k j
→ find (A `→ B) k (i · j)
f-∀ : find A (#S k) (i · j)
→ find (`∀ A) k (i · j)
find-ε : find A k `□
→ k ε A
find-ε (f-□ inA) = inA
find-ε (f-iso iso) = ε-var
find-arr-l : find A k `□
→ find (A `→ B) k `□
find-arr-l (f-□ inA) = f-□ (ε-arr-l inA)
find-arr-l (f-iso iso) = f-□ (ε-arr-l ε-var)
find-Z-false : find A k `■
→ ⊥
find-Z-false (f-iso ())