module Soat.Relation import public Data.Setoid %default total public export IRel : {a : Type} -> (a -> Type) -> Type IRel {a = a} x = (i : a) -> x i -> x i -> Type public export IReflexive : {a : Type} -> (x : a -> Type) -> IRel x -> Type IReflexive x rel = (i : a) -> Reflexive (x i) (rel i) public export ISymmetric : {a : Type} -> (x : a -> Type) -> IRel x -> Type ISymmetric x rel = (i : a) -> Symmetric (x i) (rel i) public export ITransitive : {a : Type} -> (x : a -> Type) -> IRel x -> Type ITransitive x rel = (i : a) -> Transitive (x i) (rel i) public export IEquivalence : {a : Type} -> (x : a -> Type) -> IRel x -> Type IEquivalence x rel = (i : a) -> Setoid.Equivalence (x i) (rel i) public export record ISetoid (a : Type) where constructor MkISetoid 0 U : a -> Type 0 relation : IRel U equivalence : IEquivalence U relation public export isetoid : (a -> Type) -> ISetoid a isetoid u = MkISetoid u (\_ => Equal) (\_ => equiv) public export IFunc : {a : Type} -> (x, y : a -> Type) -> Type IFunc {a} x y = (i : a) -> x i -> y i public export record IFunction {a : Type} (x, y : ISetoid a) where constructor MkIFunction func : IFunc x.U y.U cong : (i : a) -> {u, v : x.U i} -> x.relation i u v -> y.relation i (func i u) (func i v)