为任意数量的变量生成真值表的方法

时间:2016-02-01 02:41:16

标签: haskell

如何为["a", "b", "c"]之类的输入生成所有可能的真/假组合的真值表。

我觉得很难递归地思考它!

例如: 输入:["a", "b"] 输出:

        [ [("a",True), ("b",True)], 
          [("a",True), ("b",False)],
          [("a",False), ("b",True)],
          [("a",False), ("b",False)] ]

1 个答案:

答案 0 :(得分:4)

如何为a类型的变量表示真值表?

type TruthTable a = [(a, Bool)]

truthTables :: [a] -> [TruthTable a]

没有变量的真值表是什么?只有一个:不包含变量赋值的那个。

truthTables [] = [[]]

在给定v:vs的真值表的情况下,如何为变量vs构造所有可能的真值表?您将vs的每个可能的真值表,以及v的每个可能的分配,并将它们组合起来:

truthTables (v:vs) = [(v, b):others | b <- [True, False], others <- truthTables vs]

我们也可以使用Monad的{​​{1}}实例编写它:

[]