问题
If I have some values A B C, is is possible to generate a list of all their possible truth values: the input is ["X", "Y", "Z"] e.g. the list contains 8 lists (rows of table)
[ [ ("X",True), ("Y",True), ("Z", True) ],
[ ("X",True), ("Y",True), ("Z", False) ],.... ]
Are there any hints on how to do this?
I would like to generate a truth table for an arbitrary number of variables.
回答1:
What you need is not a truth table but rather a cartesian product.
You can obtain what you want using list comprehension: [(x,y,z) | x <- [True, False], y <- [True,False], z <- [True,False]]
If you want to keep variable names you can use tuples: [(x,y,z) | x <- [("X", True), ("X", False)], y <- [("Y", True), ("Y", False)], z <- [("Z", True),("Z", False)]]
回答2:
Let the recursion be with you. If you have a truth table for n
variables, you can obtain one for n+1
variables (with added variable X
) by appending first (X, True)
to the table for n
variables, and then appending (X, False)
.
truthTable :: [String] -> [[(String, Bool)]]
truthTable [] = [[]]
truthTable (x:xs) = (map ((x,True):) ts) ++ (map ((x,False):) ts) where ts = truthTable xs
来源:https://stackoverflow.com/questions/35120766/generating-a-truth-table