我想在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的列表列表,其中包含TrueFalse的所有可能排列。您无需使用concat;结果已经包括您的函数的所有可能的条目。之所以如此,是因为您要检查的函数已经需要一个列表(以\[a,b,c...]的形式)。

也就是说,对于采用长度为3的列表的fncombinations 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]->...,则由于模式匹配,将在其中分配xyz

关于haskell - 将列表应用于输入的功能以检查重言式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8461283/

10-11 22:34
查看更多