GIML: Tutorial Seven: Answers

fun unfair(P,r) = r | unfair(x++q,r) = x++unfair(q,r); fun doomsday(P) = P | doomsday(q) = front q ++ doomsday(remove q); fun rude(pushy,P) = pushy++P | rude(pushy,x++q) = x++rude(pushy,q); fun coup q = front q ++ remove q; fun nthq(q, 0) = P | nthq(q, n) = rude(front q, nthq(remove q,n-1)); fun l2q nil = P | l2q(h::t) = h++l2q t; fun q2l P = nil | q2l(x++q) = x::q2l q; fun fair(q, P) = q | fair(P, q) = q | fair(q, q') = rude(front q',rude(front q,fair(remove q,remove q')));