let set Empty = variant[] let set Unit = record {} let element pt : Unit = {} let set Two = variant [ zero : Unit | one : Unit] let signature SetWithEquivRelation = theory { Carrier :: Set, Relation :: (x : set-of(Carrier)) (y: set-of(Carrier)) -> Set, Reflexive :: (x : set-of(Carrier)) -> , Symmetric :: (x : set-of(Carrier)) (y : set-of(Carrier)) (r : set-of(Relation x y)) -> , Transitive :: (x : set-of(Carrier)) (y : set-of(Carrier)) (z : set-of(Carrier)) (r : set-of(Relation x y)) (s : set-of(Relation y z)) -> } let instance eqTwo :: SetWithEquivRelation = { .Carrier = Two :: Set, .Relation = for (x: Two) (y: Two), case x of [ zero. _ => case y of [ zero. _ => Unit :: Set | one. _ => Empty :: Set ] | one. _ => case y of [ zero. _ => Empty :: Set | one. _ => Unit :: Set ] ], .Reflexive = for (x: Two), case x of [ zero. _ => | one. _ => ], .Symmetric = for (x: Two) (y: Two) (r: set-of(Relation x y)), case x of [ zero. _ => case y of [ zero. _ => | one. _ => ] | one. _ => case y of [ zero. _ => | one. _ => ] ], .Transitive = for (x: Two)(y: Two)(z: Two)(r: set-of(Relation x y))(s: set-of(Relation y z)), case x of [ zero. _ => case y of [ zero. _ => case z of [ zero. _ => | one. _ => ] | one. _ => case z of [ zero. _ => | one. _ => ] ] | one. _ => case y of [ zero. _ => case z of [ zero. _ => | one. _ => ] | one. _ => case z of [ zero. _ => | one. _ => ] ] ] } let set Diagonal = record { x : set-of(eqTwo .Carrier), y : set-of(eqTwo .Carrier), equal : set-of((eqTwo .Relation) x y) } let element oneEqualsOne : Diagonal = { .x = one. pt, .y = one. pt, .equal = pt }