Prelude Control.Monad> let truthPermutations n = replicateM n [False,True] Prelude Control.Monad> truthPermutations 3 [[False,False,False],[False,False,True],[False,True,False],[False,True,True], [True,False,False],[True,False,True],[True,True,False],[True,True,True]] Prelude Control.Monad> let satisfies p [x,y,z] = p x y == z Prelude Control.Monad> filter (satisfies (==>)) $ truthPermutations 3 [[False,False,True],[False,True,True],[True,False,False],[True,True,True]]
Try expressing truth tables so succinctly and at such a high level in an imperative language. The list monad rocks.