The 
loop operator expresses computations in which an output
value is fed back as input, although the computation occurs only once.
It underlies the 
rec value recursion construct in arrow
notation. 
loop should satisfy the following laws:
where
assoc ((a,b),c) = (a,(b,c))
unassoc (a,(b,c)) = ((a,b),c)