Hugs 98で機能しているアップダウン/交互順列問題の成功リストを使用して、次の解決策を得ました。
updown :: (Ord a) => [a] -> [[a]]
updown [] = [[]]
updown list = smaller list
bigger :: (Ord a) => [a] -> [[a]]
bigger [] = [[]]
bigger [x] = [[x]]
bigger list = [n:p | n <- list,p <- smaller (filter (/=n) list),n < p!!0]
smaller :: (Ord a) => [a] -> [[a]]
smaller [] = [[]]
smaller [x] = [[x]]
smaller list = [n:p | n <- list,p <- bigger (filter (/=n) list),n > p!!0]
ご覧のとおり、この関数は LoS を使用して適合しないソリューションをすべて除外します。今、私は同じ結果を得る方法を考えていましたが、明示的なバックトラッキングを使用して (累積パラメーターに部分的な解決策を組み込みます。再帰のさらに先に解決策があります)。正しい方向へのちょっとした微調整が必要なだけです。ありがとう!