il :: a -> [a] -> [[a]] il x [] = [[x]] il x (y:l) = [x:y:l] ++ [y:l2 | l2 <- (il x l)] perm :: [a] -> [[a]] perm [] = [[]] perm (x:l) = [z | y <- perm l, z <- il x y] data Symbol = A | B | C | D deriving(Eq,Ord,Show) type SymTuple4 = (Symbol, Symbol, Symbol, Symbol) perm1 :: SymTuple4 -> SymTuple4 perm1 (a,b,c,d) = (b,a,c,d) perm2 :: SymTuple4 -> SymTuple4 perm2 (a,b,c,d) = (c,b,a,d) perm3 :: SymTuple4 -> SymTuple4 perm3 (a,b,c,d) = (d,b,c,a)