Agda-2.3.2.2: examples/outdated-and-incorrect/iird/IID-Proof.agda
module IID-Proof where
import Logic.ChainReasoning as Chain
open import LF
open import Identity
open import IID
open import IIDr
open import IID-Proof-Setup
open import DefinitionalEquality
Ug : {I : Set} -> OPg I -> I -> Set
Ug γ i = Ur (ε γ) i
introg : {I : Set}(γ : OPg I)(a : Args γ (Ug γ)) -> Ug γ (index γ (Ug γ) a)
introg γ a = intror (g→rArgs γ (Ug γ) a)
-- The elimination rule.
elim-Ug : {I : Set}(γ : OPg I)(C : (i : I) -> Ug γ i -> Set) ->
((a : Args γ (Ug γ)) -> IndHyp γ (Ug γ) C a -> C (index γ (Ug γ) a) (introg γ a)) ->
(i : I)(u : Ug γ i) -> C i u
elim-Ug {I} γ C m = elim-Ur (ε γ) C step -- eliminate the restricted type
where
U = Ug γ
-- we've got a method to take care of inductive occurrences for general families (m),
-- but we need something to handle the restricted encoding.
step : (i : I)(a : rArgs (ε γ) U i) -> IndHyp (ε γ i) U C a -> C i (intror a)
step i a h = conclusion
where
-- First convert the argument to a general argument
a' : Args γ U
a' = r→gArgs γ U i a
-- Next convert our induction hypothesis to an hypothesis for a general family
h' : IndHyp γ U C a'
h' = r→gIndHyp γ U C i a h
-- Our method m can be applied to the converted argument and induction
-- hypothesis. This gets us almost all the way.
lem₁ : C (index γ U a') (intror (g→rArgs γ U a'))
lem₁ = m a' h'
-- Now we just have to use the fact that the computed index is the same
-- as our input index, and that g→rArgs ∘ r→gArgs is the identity.
-- r←→gArgs-subst will perform the elimination of the identity proof.
conclusion : C i (intror a)
conclusion = r←→gArgs-subst γ U (\i a -> C i (intror a)) i a lem₁
open module Chain-≡ = Chain.Poly.Heterogenous _≡_ (\x -> refl-≡) trans-≡
-- What remains is to prove that the reduction behaviour of the elimination
-- rule is the correct one. I.e that
-- elim-Ug C m (index a) (introg a) ≡ m a (induction C (elim-Ug C m) a)
elim-Ug-reduction :
{I : Set}(γ : OPg I)(C : (i : I) -> Ug γ i -> Set)
(m : (a : Args γ (Ug γ)) -> IndHyp γ (Ug γ) C a -> C (index γ (Ug γ) a) (introg γ a))
(a : Args γ (Ug γ)) ->
elim-Ug γ C m (index γ (Ug γ) a) (introg γ a)
≡ m a (induction γ (Ug γ) C (elim-Ug γ C m) a)
elim-Ug-reduction γ C m a =
chain> elim-Ug γ C m (index γ (Ug γ) a) (introg γ a)
-- Unfolding the definition of elim-Ug we get
=== r←→gArgs-subst γ U C' i ra
(m gra (r→gih \hyp -> elim-Ug γ C m (r-ind-index hyp) (r-ind-value hyp)))
by refl-≡
-- Now (and this is the key step), since we started with a value in the
-- generalised type we know that the identity proof is refl, so
-- r←→gArgs-subst is the identity.
=== m gra (r→gih \hyp -> elim-Ug γ C m (r-ind-index hyp) (r-ind-value hyp))
by r←→gArgs-subst-identity γ U C' a _
-- We use congruence to prove separately that gra ≡ a and that the computed
-- induction hypothesis is the one we need.
=== m a (\hyp -> elim-Ug γ C m (g-ind-index hyp) (g-ind-value hyp))
by cong₂-≡' m (g←→rArgs-identity γ U a)
-- The induction hypotheses match
(η-≡ \hyp₀ hyp₁ hyp₀=hyp₁ ->
chain> r→gih (\hyp -> elim-Ug γ C m (r-ind-index hyp) (r-ind-value hyp)) hyp₀
-- Unfolding the definition of r→gih we get
=== g→rIndArg-subst γ U C i ra hyp₀
(elim-Ug γ C m (r-ind-index (g→rIndArg γ U i ra hyp₀))
(r-ind-value (g→rIndArg γ U i ra hyp₀))
)
by refl-≡
-- g→rIndArg-subst is definitionally the identity.
=== elim-Ug γ C m (r-ind-index (g→rIndArg γ U i ra hyp₀))
(r-ind-value (g→rIndArg γ U i ra hyp₀))
by g→rIndArg-subst-identity γ U C i ra hyp₀ _
-- We can turn the restricted inductive occurrence into a
-- generalised occurrence.
=== elim-Ug γ C m (IndIndex γ U gra hyp₀) (Ind γ U gra hyp₀)
by g→rIndArg-subst γ U
(\j b -> elim-Ug γ C m (r-ind-index (g→rIndArg γ U i ra hyp₀))
(r-ind-value (g→rIndArg γ U i ra hyp₀))
≡ elim-Ug γ C m j b
) i ra hyp₀ refl-≡
-- Finally we have gra ≡ a and hyp₀ ≡ hyp₁ so we're done.
=== elim-Ug γ C m (IndIndex γ U a hyp₁) (Ind γ U a hyp₁)
by cong₂-≡' (\a hyp -> elim-Ug γ C m (IndIndex γ U a hyp)
(Ind γ U a hyp)
) (g←→rArgs-identity γ U a) hyp₀=hyp₁
)
-- Writing it in a nicer way:
=== m a (induction γ (Ug γ) C (elim-Ug γ C m) a)
by refl-≡
where
U = Ug γ
i = index γ U a
ra = g→rArgs γ U a
gra = r→gArgs γ U i ra
r→gih = r→gIndHyp γ U C i ra
r-ind-index = IndIndex (ε γ i) (Ur (ε γ)) ra
r-ind-value = Ind (ε γ i) (Ur (ε γ)) ra
g-ind-index = IndIndex γ U a
g-ind-value = Ind γ U a
C' = \i a -> C i (intror a)