将列表应用于输入的函数以检查重言式

时间:2011-12-11 01:30:21

标签: haskell lambda

我想在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个变量中。

提前致谢:)

1 个答案:

答案 0 :(得分:0)

您的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将在其中分配,这要归功于模式匹配。