packages feed

idris-0.1.7: lib/equalities.idr

include "maybe.idr";
include "vect.idr";

data EqNat : Nat -> Nat -> Set where
    eqO : EqNat O O
  | eqS : EqNat x y -> EqNat (S x) (S y);

eqNat' : (x:Nat) -> (y:Nat) -> Maybe (EqNat x y);
eqNat' O O = Just eqO;
eqNat' (S x) (S y) with eqNat' x y {
  eqNat' (S x) (S x) | Just p = Just (eqS p);
  eqNat' (S x) (S y) | Nothing = Nothing;
}
eqNat' _ _ = Nothing;

eqNat : Nat -> Nat -> Bool;
eqNat x y with eqNat' x y {
  eqNat x x | Just _ = True;
  eqNat x y | Nothing = False;
}

data EqFin : Fin n -> Fin n -> Set where
    eqfO : {k:Nat} -> EqFin {n=S k} fO fO
  | eqfS : {x:Fin n} -> {y:Fin n} -> EqFin x y -> EqFin (fS x) (fS y);

eqFin' : (x:Fin n) -> (y:Fin n) -> Maybe (EqFin x y);
eqFin' fO fO = Just eqfO;
eqFin' (fS x) (fS y) with eqFin' x y {
  eqFin' (fS x) (fS x) | Just p = Just (eqfS p);
  eqFin' (fS x) (fS y) | Nothing = Nothing;
}
eqFin' _ _ = Nothing;

eqFin : Fin n -> Fin n -> Bool;
eqFin x y with eqFin' x y {
  eqFin x x | Just _ = True;
  eqFin x y | Nothing = False;
}