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')));