(define cartesian-product {(list A) --> (list A) --> (list (list A))} [ ] _ -> [ ] [X | Y] Z -> (append (pair X Z) (cartesian-product Y Z))) (define pair {A --> (list A) --> (list (list A))} _ [ ] -> [ ] X [Y | Z] -> [[X Y] | (pair X Z)]) (define converge* {(A --> A) --> A --> (A --> A --> boolean) --> A} F X R -> (converge-help F (F X) X R)) (define converge-help {(A --> A) --> A --> A --> (A --> A --> boolean) --> A} _ New Old R -> New where (R Old New) F New _ R -> (converge-help F (F New) New R)) "(define cartesian-product {(list A) --> (list B) --> (list (A * B))} [ ] _ -> [ ] [X | Y] Z -> (append (pair X Z) (cartesian-product Y Z))) (define pair {A --> (list B) --> (list (A * B))} _ [ ] -> [ ] X [Y | Z] -> [(@p X Y) | (pair X Z)])"