(def-constant br%reflexive
"lambda(r:sets[ind_1,ind_1],
forall(x:ind_1, #(r(x,x))))"
(theory generic-theory-1))
(def-constant br%symmetric
"lambda(r:sets[ind_1,ind_1],
forall(x,y:ind_1, #(r(x,y)) implies #(r(y,x))))"
(theory generic-theory-1))
(def-constant br%transitive
"lambda(r:sets[ind_1,ind_1],
forall(x,y,z:ind_1, #(r(x,y)) and #(r(y,z)) implies #(r(x,z))))"
(theory generic-theory-1))
(def-constant br%equiv%relation
"lambda(r:sets[ind_1,ind_1],
br%reflexive(r) and br%symmetric(r) and br%transitive(r))"
(theory generic-theory-1))
(def-constant pred%to%rel
"lambda(p:[ind_1,ind_1 -> prop],
lambda(x,y:ind_1, if(p(x,y), an%individual, ?unit%sort)))"
(theory generic-theory-1))
(def-constant equiv%predicate
"lambda(pred:[ind_1,ind_1 -> prop], br%equiv%relation(pred%to%rel(pred)))"
(theory generic-theory-1))
(def-theorem characterization-of-equivalence-predicates
"forall(rel:[ind_1,ind_1 -> prop],
equiv%predicate(rel) iff
(forall(a,b,c:ind_1, rel(a,b) and rel(b,c) implies rel(a,c))
and
forall(a:ind_1, rel(a,a))
and
forall(a,b:ind_1, rel(a,b) implies rel(b,a))))"
(theory generic-theory-1)
(proof
(
(unfold-single-defined-constant-globally equiv%predicate)
unfold-defined-constants
unfold-defined-constants
(prove-by-logic-and-simplification 0)
)))