Agda-2.3.2.2: examples/AIM5/PolyDep/Homogenous/Reflexivity.agda
module Homogenous.Reflexivity where
import Homogenous.Base
import Homogenous.Equality
open Homogenous.Base using(Arity; Sig; Fa; Fa1; F; F1; T; It; FIHa; FIH; R)
open Homogenous.Equality using(equal; eq_step; eq_step'; eq_step_ar)
import PolyDepPrelude
open PolyDepPrelude using(Bool; true; false; True;
pair; fst; snd;
zero; suc;
left; right;
_::_; nil;
unit)
import Tools
open Tools using(liftAnd)
import Reflexivity
open Reflexivity using(lref; Refl; refl)
-- -----------------------------
-- Reflexivity
-- Short-hand notation for mapping a rel. over Fa resp. F
Fa1rel : (n : Arity)-> (X : Set) -> (X -> X -> Bool) ->
Fa n X -> Fa n (X -> Bool)
Fa1rel n X r = Fa1 n (\x -> (\y -> r x y) )
F1rel : (fi : Sig)(X : Set) -> (X -> X -> Bool) -> F fi X -> F fi (X -> Bool)
F1rel fi X r = F1 fi (\x -> (\y -> r x y) )
-- Now the real reflexivity lemmas start
ref_eq_step_ar : (n : Arity) (Y : Set) (e : Y -> Y -> Bool) (x : Fa n Y)
(ih : FIHa n (lref e) x)
-> True (eq_step_ar n (Fa1rel n Y e x) x)
ref_eq_step_ar (zero) Y e (unit) (unit) = unit
ref_eq_step_ar (suc m) Y e (pair y ys) (pair r rs) with e y y | r
ref_eq_step_ar (suc m) Y e (pair y ys) (pair r rs) | false | ()
ref_eq_step_ar (suc m) Y e (pair y ys) (pair r rs) | true | unit =
ref_eq_step_ar m Y e ys rs
-- Reflexivity for matching constructors is trivial
ref_eq_step' : (fi : Sig)(X : Set)(e : X -> X -> Bool)(x : F fi X)
-> FIH fi (lref e) x -> True (eq_step' fi (F1rel fi X e x) x)
ref_eq_step' (nil) X e () -- empty
ref_eq_step' (n :: ns) X e (left x') = ref_eq_step_ar n X e x'
ref_eq_step' (n :: ns) X e (right y) = ref_eq_step' ns X e y
ref_eq' : (fi : Sig) -> (x : T fi) -> lref (equal fi) x
ref_eq' fi = R fi (ref_eq_step' fi (T fi) (equal fi))
ref_eq : (fi : Sig) -> Refl (equal fi)
ref_eq fi = refl (R fi (ref_eq_step' fi (T fi) (equal fi)))