RlationalOperators

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