是否有一种有效的算法来查找布尔函数的哪个组合将匹配给定布尔函数的输出?

时间:2013-02-15 19:59:29

标签: algorithm functional-programming boolean boolean-logic

假设我有以下布尔函数。

def Bottom():
    return False

def implies(var1, var2):
    if var1 == True and var2 == False: return False
    return True

def land(var1, var2):
    return var1 == True and var2 == True.

是否有一种有效的算法将这三个函数作为输入,并确定前两个函数的哪个(可能是多个应用程序)功能组合将匹配每个布尔(T,F)输入的第三个函数的输出到第三个功能?

我正在使用Python编写我的示例,但我并没有限制Python或任何编程语言的解决方案。 事实上,我实际上并不是在寻找代码,而是更多关于算法的描述或解释为什么不存在代码。

作为旁注,我试图发现这个算法的动机是因为我被要求显示一组特定逻辑连接词的功能完整性,我们这样做是通过显示一个逻辑连接词可以被某个集合模拟别人的。 对于逻辑,我们必须使用一些猜测和检查,但我无法找到一种方法来捕获程序中没有线性搜索的大量可能性。

1 个答案:

答案 0 :(得分:2)

如果您只查看两个参数的布尔函数,则可以使用简单的强力技术。它可以扩展到三元逻辑,或三元函数,甚至两者,但它是指数的,所以你不能把它推得太远。这是布尔版本;我希望如何扩展它是显而易见的。

1)二进制布尔函数是关系{False, True} X {False, True} -> {False, True}。其中正好有16个。注意,这些包括独立于一个或甚至两个输入的各种功能。所以让我们使这个集合完全由这16个函数组成,现在注意每个布尔函数都有一个相应的高阶函数X - >

2)现在,从布尔函数Take firstTake second开始,并使用与“给定函数”对应的HOF构造闭包。如果目标函数在闭包中,那么它可以通过给定函数的某种组合来实现。更一般地说,如果in中的每个元素都在闭包中,那么给定的函数是通用的。

所以,让我们将此应用于您的示例。我将按顺序编写与输入(F,F) (F,T) (T,F) (T,T)对应的四元组元素,并且我将用粗体编写HOF。因此BottomFFFFImpliesTTFT。对于任何(a,b),底部(a,b)为FFFF

Take firstFFTTTake secondFTFT,因此这是我们的起始集。我们可以使用底部添加FFFF,但很明显底部的其他应用程序不会添加任何内容。

所以现在我们有九个可能的功能对,我们可以应用于意味着。我们走了:

隐含FFTTFFTT)== TTTT(新)

隐含FFTTFTFT)== TTFT(新)

隐含FFTTFFFF)== TTFF(新)

隐含FTFTFFTT)== TFTT(新)

隐含FTFTFTFT)== TTTT

隐含FTFTFFFF)== TFTF(新)

隐含FFFFFFTT)== TTTT

隐含FFFFFTFT)== TTTT

隐含FFFFFFFF)== TTTT

现在我们最多有16个函数中的8个,我们还有更多对要检查。由于这实际上是一套完整的,所以它会变得乏味,所以我会将下一步留给读者(或者他们的计算机程序)。