fun ('a) conslist (x, []) = [] | conslist (x, xs :: xss) = (x :: xs) :: conslist (x, xss) withtype {n:nat,p:nat}
=>
'a * ('a list(n)) list(p) -> ('a list(n+1)) list(p)
fun ('a)
perm [] = [[]]
| perm (x :: xs) = perm_aux (x, [], xs, conslist (x, perm xs))
withtype {n:nat}