{-# OPTIONS --safe --with-K #-}
module Examples.WithoutMacros.Acc where
open import Prelude hiding (lookupAny)
--open import Generics.Description
--open import Generics.Recursion
--open import Generics.Reflection
--
--open import Generics.RecursionScheme
--open import Generics.SimpleContainer
--open import Generics.SimpleContainer.Any
data Acc {A : Set ℓ} (R : A → A → Set ℓ') : A → Set (ℓ ⊔ ℓ') where
acc : {x : A} → ((y : A) → R y x → Acc R y) → Acc R x
--------
-- Strong induction as the fold operator on Acc
--instance
-- AccC : Named (quote Acc) _
-- unNamed AccC = genDataC AccD (genDataT AccD Acc)
-- where AccD = genDataD Acc
--
--private
-- foldAccP : FoldP
-- foldAccP = fold-operator (quote Acc)
-- unquoteDecl foldAcc = defineFold foldAccP foldAcc
foldAcc :
∀ {ℓ'' ℓ ℓ'} {A : Set ℓ} {R : A → A → Set ℓ'} {P : A → Set ℓ''}
→ ((x : A) → ((y : A) → R y x → P y) → P x)
→ (x : A) → Acc R x → P x
foldAcc p x (acc accs) = p x (λ y r → foldAcc p y (accs y r))
--instance foldAccC = genFoldC foldAccP foldAcc
--------
-- Descending chains in terms of the Any predicate
--instance
-- AccS : SCᵈ (findDataD (quote Acc))
-- AccS = record
-- { El = λ (A , _) → A
-- ; pos = (true ∷ tt ∷ []) ∷ []
-- ; coe = λ _ → (refl ,ωω λ _ → lift tt) ,ωω lift tt }
--
--private
-- AccAnyD : DataD
-- AccAnyD = AnyD (quote Acc)
-- unquoteDecl data AccAny constructor c0 c1 = defineByDataD AccAnyD AccAny (c0 ∷ c1 ∷ [])
data AccAny {ℓ'' ℓ ℓ'} {A : Set ℓ} {R : A → A → Set ℓ'}
(P : A → Set ℓ'') : (x : A) → Acc R x → Set (ℓ ⊔ ℓ' ⊔ ℓ'') where
here : ∀ {x accs} → P x → AccAny P x (acc accs)
there : ∀ {x accs y} (r : R y x)
→ AccAny P y (accs y r) → AccAny P x (acc accs)
--instance
-- AccAnyC : Named (quote AccAny) _
-- unNamed AccAnyC = genDataC AccAnyD AccAnyT
-- where AccAnyT = genDataT AccAnyD AccAny
--
--private
-- lookupAnyAccP : FoldP
-- lookupAnyAccP = lookupAny (quote Acc)
--unquoteDecl lookupAnyAcc = defineFold lookupAnyAccP lookupAnyAcc
lookupAnyAcc :
∀ {ℓ'' ℓ ℓ'} {A : Set ℓ} {R : A → A → Set ℓ'} {P : A → Set ℓ''}
{x : A} {a : Acc R x} → AccAny P x a → Σ A P
lookupAnyAcc (here p ) = _ , p
lookupAnyAcc (there _ i) = lookupAnyAcc i
--instance lookupAnyAccC = genFoldC lookupAnyAccP lookupAnyAcc