0 :: a ascending_sort :: b → b cons :: a → b → b descending_sort :: b → b insert :: (a → a → a) → (a → a → a) → b → a → b max :: a → a → a min :: a → a → a nil :: b s :: a → a sort :: (a → a → a) → (a → a → a) → b → b max(0, X) → X max(Y, 0) → Y max(s(U), s(V)) → max(U, V) min(0, W) → 0 min(P, 0) → 0 min(s(X1), s(Y1)) → min(X1, Y1) insert(G1, H1, nil, W1) → cons(W1, nil) insert(J1, F2, cons(Y2, U2), V2) → cons(J1(V2, Y2), insert(J1, F2, U2, F2(V2, Y2))) sort(I2, J2, nil) → nil sort(F3, Z3, cons(U3, V3)) → insert(F3, Z3, sort(F3, Z3, V3), U3) ascending_sort(W3) → sort(min, max, W3) descending_sort(P3) → sort(max, min, P3)