(define insert L 0 E -> [E|L] [L|Ls] N E -> [L|(insert Ls (- N 1) E)]) (define seq Start Start -> [Start] Start End -> [Start|(seq (+ Start 1) End)]) (define append-lists [] -> [] [A|B] -> (append A (append-lists B))) (define permutate [] -> [[]] [H|T] -> (append-lists (map (/. P (map (/. N (insert P N H)) (seq 0 (length P)))) (permute T))))