我想在haskell中编写一个函数,它确定一个布尔函数(用ghci中的lambda表达式输入)是否是重言式。 输入应如下所示:
taut n (\[x..] -> ... == ...)
taut 3 (\[x,y,z] -> ((x||y)||z) == (x||(y||z)) )
我已经用
创建了所有可能的布尔组合combinations n = replicateM n [True,False]
cmb n = concat (combinations n)
但现在我需要一个函数,它接受列表中的这些元素并将它们插入到当时输入的函数中的n个变量中。
提前致谢:)
答案 0 :(得分:0)
您的combinations
函数已生成长度为n
的列表列表,其中包含True
和False
的所有可能排列。您不需要使用concat
;结果已包含函数的所有可能条目。这种情况就是这样,因为您正在检查的函数已经需要一个列表(它的格式为\[a,b,c...]
)。
也就是说,对于列出长度为3的fn
,combinations 3
将是:
[[True,True,True],[True,True,False],[True,False,True],[True,False,False],
[False,True,True],[False,True,False],[False,False,True],[False,False,False]]
此列表的每个元素都是列表;您可以直接将它们传递给您正在检查的功能(可能是重言式的功能)。鉴于上面的列表,您所要做的就是尝试每个元素。
编辑(试图澄清一下):
你想要一个函数taut
,它接受类型[Bool] -> Bool
的另一个函数,并确定该函数是否是重言式。这意味着taut
将具有类似Int -> ([Bool] -> Bool) -> Bool
的类型。假设你是这样开始的:
taut :: Int -> ([Bool] -> Bool) -> Bool
taut n fn = ...
现在,n
是长度,fn
是函数。您的combinations
函数需要n
并将每个可能的有效输入返回到fn
。请注意,fn
需要[Bool]
且combinations n
为[[Bool]]
,这意味着每个元素都可以作为fn
的输入。知道了这一点,您需要做的只是将fn
应用于combinations n
的每个元素,并查看结果是否始终相同。
在taut
函数中,您不必担心如何分配被测试函数中的变量。当您实际编写该函数时,如果它的格式为\[x,y,z]->...
,则x
,y
和z
将在其中分配,这要归功于模式匹配。