import Control.SetFunctions perm :: [a] -> [a] perm [] = [] perm (x:xs) = insert x (perm xs) where insert z ys = z : ys insert z (y:ys) = y : insert z ys unsafe :: [Int] -> Bool unsafe xs | xs =:= _ ++ [i] ++ zs ++ [j] ++ _ = abs (i-j) =:= length zs + 1 where i,j,zs free -- solving the n queens problem: queens :: Int -> [Int] queens n | isEmpty ((set1 unsafe) p) = p where p = perm [1 .. n]