open import Data.Product
open import Data.Unit.Polymorphic
open import Function
open import Relation.Binary.PropositionalEquality
module IR
(D : Set)
where
data IR : Set1 where
done : D → IR
non-ind : (A : Set) → (A → IR) → IR
ind : (A : Set) → ((A → D) → IR) → IR
record Fam (X : Set) : Set1 where
constructor _,_
field
idx : Set
fam : idx → X
record FamMorphism {X : Set} (A B : Fam X) : Set1 where
constructor _,_
open Fam
field
idxfun : idx A → idx B
famfun : (x : idx A) → fam A x ≡ fam B (idxfun x)
Arg : IR → Fam D → Set
Arg (done d) XT = ⊤
Arg (non-ind A γ) XT = Σ[ a ∈ A ] (Arg (γ a) XT)
Arg (ind A γ) XT@(X , T) = Σ[ f ∈ ((x : A) → X) ] (Arg (γ (T ∘ f)) XT)
Val : (γ : IR) → (XT : Fam D) → Arg γ XT → D
Val (done d) XT x = d
Val (non-ind A γ) XT (a , x) = Val (γ a) XT x
Val (ind A γ) XT@(X , T) (g , x) = Val (γ (λ x → T (g x))) XT x
ArgVal : (γ : IR) → Fam D → Fam D
ArgVal γ XT = (Arg γ XT , Val γ XT)
mutual
{-# NO_POSITIVITY_CHECK #-}
data U (γ : IR) : Set where
inn : Arg γ (U γ , T γ) → U γ
{-# TERMINATING #-}
T : (γ : IR) → U γ → D
T γ (inn x) = Val γ (U γ , T γ) x
private
inn-morphism : ∀ γ → FamMorphism (ArgVal γ (U γ , T γ)) (U γ , T γ)
inn-morphism γ = (inn , λ x → refl)