Agda-2.3.2.2: examples/outdated-and-incorrect/iird/IIRDg.agda
{-# OPTIONS --no-positivity-check #-}
module IIRDg where
import LF
import DefinitionalEquality
import IIRD
open LF
open DefinitionalEquality
open IIRD
mutual
data Ug {I : Set}{D : I -> Set1}(γ : OPg I D) : I -> Set where
introg : (a : Gu γ (Ug γ) (Tg γ)) -> Ug γ (Gi γ (Ug γ) (Tg γ) a)
Tg : {I : Set}{D : I -> Set1}(γ : OPg I D)(i : I) -> Ug γ i -> D i
Tg γ .(Gi γ (Ug γ) (Tg γ) a) (introg a) = Gt γ (Ug γ) (Tg γ) a
Arg : {I : Set}{D : I -> Set1}(γ : OPg I D) -> Set
Arg γ = Gu γ (Ug γ) (Tg γ)
index : {I : Set}{D : I -> Set1}(γ : OPg I D) -> Arg γ -> I
index γ a = Gi γ (Ug γ) (Tg γ) a
IH : {I : Set}{D : I -> Set1}(γ : OPg I D)(F : (i : I) -> Ug γ i -> Set1) -> Arg γ -> Set1
IH γ = KIH γ (Ug γ) (Tg γ)
-- Elimination rule
Rg : {I : Set}{D : I -> Set1}(γ : OPg I D)(F : (i : I) -> Ug γ i -> Set1) ->
(h : (a : Arg γ) -> IH γ F a -> F (index γ a) (introg a)) ->
(i : I)(u : Ug γ i) -> F i u
Rg γ F h .(index γ a) (introg a) = h a (Kmap γ (Ug γ) (Tg γ) F (Rg γ F h) a)
{-
-- We don't have general IIRDs so we have to postulate Ug/Tg
postulate
Ug : {I : Set}{D : I -> Set1} -> OPg I D -> I -> Set
Tg : {I : Set}{D : I -> Set1}(γ : OPg I D)(i : I) -> Ug γ i -> D i
introg : {I : Set}{D : I -> Set1}(γ : OPg I D)(a : Gu γ (Ug γ) (Tg γ)) ->
Ug γ (Gi γ (Ug γ) (Tg γ) a)
Tg-equality : {I : Set}{D : I -> Set1}(γ : OPg I D)(a : Gu γ (Ug γ) (Tg γ)) ->
Tg γ (Gi γ (Ug γ) (Tg γ) a) (introg γ a) ≡₁ Gt γ (Ug γ) (Tg γ) a
Rg : {I : Set}{D : I -> Set1}(γ : OPg I D)(F : (i : I) -> Ug γ i -> Set1)
(h : (a : Gu γ (Ug γ) (Tg γ)) -> KIH γ (Ug γ) (Tg γ) F a -> F (Gi γ (Ug γ) (Tg γ) a) (introg γ a))
(i : I)(u : Ug γ i) -> F i u
Rg-equality : {I : Set}{D : I -> Set1}(γ : OPg I D)(F : (i : I) -> Ug γ i -> Set1)
(h : (a : Gu γ (Ug γ) (Tg γ)) -> KIH γ (Ug γ) (Tg γ) F a -> F (Gi γ (Ug γ) (Tg γ) a) (introg γ a))
(a : Gu γ (Ug γ) (Tg γ)) ->
Rg γ F h (Gi γ (Ug γ) (Tg γ) a) (introg γ a)
≡₁ h a (Kmap γ (Ug γ) (Tg γ) F (Rg γ F h) a)
-- Helpers
ι★g : {I : Set}(i : I) -> OPg I (\_ -> One')
ι★g i = ι < i | ★' >'
-- Examples
module Martin-Löf-Identity where
IdOP : {A : Set} -> OPg (A * A) (\_ -> One')
IdOP {A} = σ A \a -> ι★g < a | a >
_==_ : {A : Set}(x y : A) -> Set
x == y = Ug IdOP < x | y >
refl : {A : Set}(x : A) -> x == x
refl x = introg IdOP < x | ★ >
-- We have to work slightly harder than desired since we don't have η for × and One.
private
-- F C is just uncurry C but dependent and at high universes.
F : {A : Set}(C : (x y : A) -> x == y -> Set1)(i : A * A) -> Ug IdOP i -> Set1
F C < x | y > p = C x y p
h' : {A : Set}(C : (x y : A) -> x == y -> Set1)
(h : (x : A) -> C x x (refl x))
(a : Gu IdOP (Ug IdOP) (Tg IdOP)) -> KIH IdOP (Ug IdOP) (Tg IdOP) (F C) a ->
F C (Gi IdOP (Ug IdOP) (Tg IdOP) a) (introg IdOP a)
h' C h < x | ★ > _ = h x
J : {A : Set}(C : (x y : A) -> x == y -> Set1)
(h : (x : A) -> C x x (refl x))
(x y : A)(p : x == y) -> C x y p
J {A} C h x y p = Rg IdOP (F C) (h' C h) < x | y > p
J-equality : {A : Set}(C : (x y : A) -> x == y -> Set1)
(h : (x : A) -> C x x (refl x))(x : A) ->
J C h x x (refl x) ≡₁ h x
J-equality {A} C h x = Rg-equality IdOP (F C) (h' C h) < x | ★ >
module Christine-Identity where
IdOP : {A : Set}(a : A) -> OPg A (\_ -> One')
IdOP {A} a = ι★g a
_==_ : {A : Set}(x y : A) -> Set
x == y = Ug (IdOP x) y
refl : {A : Set}(x : A) -> x == x
refl x = introg (IdOP x) ★
private
h' : {A : Set}(x : A)(C : (y : A) -> x == y -> Set1)
(h : C x (refl x))(a : Gu (IdOP x) (Ug (IdOP x)) (Tg (IdOP x))) ->
KIH (IdOP x) (Ug (IdOP x)) (Tg (IdOP x)) C a ->
C (Gi (IdOP x) (Ug (IdOP x)) (Tg (IdOP x)) a) (introg (IdOP x) a)
h' x C h ★ _ = h
H : {A : Set}(x : A)(C : (y : A) -> x == y -> Set1)
(h : C x (refl x))
(y : A)(p : x == y) -> C y p
H x C h y p = Rg (IdOP x) C (h' x C h) y p
H-equality : {A : Set}(x : A)(C : (y : A) -> x == y -> Set1)
(h : C x (refl x)) ->
H x C h x (refl x) ≡₁ h
H-equality x C h = Rg-equality (IdOP x) C (h' x C h) ★
open Christine-Identity
-}