$use StdIO; $func Gen-Perms expr = e.perms; Gen-Perms expr = (/*e0*/) (expr) (/*e.perms*/) $iter { expr : t1 e2 = (e0 t1) (e2) (e.perms (t1 ())); } :: (e0) (expr) (e.perms), expr : /*empty*/ = e.perms; $func Print-Perms (e.start) t.perm = ; Print-Perms { (e.start) (t1 (v.perms)) = { v.perms : e t.p e, , $fail;; }; (e.start) (t1 ()) = ; }; Main = { // : e t.p e, : e ('6' (e ('5' (e ('4' (e ('3' (e ('2' (e ('1' (e.p)) e)) e)) e)) e)) e)) e, e.p : e t.q e, , // , // , $fail;; };