sig Book { name:set Name } sig Name { addr:set Addr, mainaddress: one Addr } sig Addr {} fun Arrow []: set Name -> Addr { Name -> Addr } fun Dot [] : set Name { Book.(Book->Name) } fun Box [] : set Addr { (Name->Addr)[Name] } fun Transpose [] : set Addr -> Name { ~(Name -> Addr) } fun TransitiveClosure []:set univ->univ { ^(name + addr) } fun ReflexiveTransitiveClosure []:set univ-> univ { *(name + addr) } fun DomainRestriction []:set univ -> univ { Book <: univ -> Name } fun RangeRestriction []:set univ -> univ { Name -> univ :> Addr } fun Override []:set univ -> univ { addr ++ mainaddress } pred show [] {} run show for exactly 2 Name, exactly 3 Addr, exactly 1 Book