我想在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个变量中。
提前致谢 :)
最佳答案
您的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
。关于haskell - 将列表应用于输入的功能以检查重言式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8461283/