如何编写一个布尔表达式来验证设置为 true 的变量数量?我将提供一个我试图解决的问题的简化示例。请在回答之前阅读整个问题,因为真正的问题在最后。
声明:
3 个布尔变量:a b c
int 预期 = 2
如何编写一个布尔表达式来验证 3 个布尔变量中是否有 2 个设置为 true。沿着
problem = (a + b + c) == 2
的思路,如果 exactly2 个布尔变量设置为 true,则
problem
将为 true。
这是问题的简化版本,只有 3 个布尔变量且预期 = 2,我们可以用
problem = (a & b) | (b & c) | (c & a)
解决问题
我的问题是,我们如何使用n数量的布尔变量以及使用一阶逻辑(包括逻辑连接词、谓词和量词)的预期变量的不同数量来解决这个问题。
我想强调,我不是在寻找任何特定语言的实际代码,而只是寻找命题/谓词表达式。
如果您假设
false
解析为 0 且 true
解析为 1,那么您可以这样做:
ans = ((a + b + c + ... + z) == expected)
其中
a..z
是布尔变量(可能是其他表达式求值的结果),expected
是您想要的真实条件的数量。
我意识到我“有点”晚了,但对于后代来说:
为了避免问题中描述的指数扩展,我们必须引入新变量并创建两个表达式 1)创建对数字进行编码的表达式 2)创建一个可以与编码进行比较的表达式
我在这里使用二进制编码,所以 3 -> 11 和 9 -> 1001,这对于程序员来说应该很熟悉
现在让我们介绍一个全加器(google一下)。这将添加三个位,返回两个新变量“sum”和“carry”
仅当奇数位为 1 时,和才为 1: (总和 & ((a&-b&-c)|(-a&b&-c)|(-a&-b&c)|(a&b&c))) | (-sum & -((a&-b&-c)|(-a&b&-c)|(-a&-b&c)|(a&b&c)))
如果至少有 2 位为 1,则进位为 1: (进位 & ((a&b)|(a&c)|(c&b))|( -进位 & -((a&b)|(a&c)|(c&b)))
现在对两个变量的总和进行编码。这个原理可以链接起来,以便添加任意数量的变量(Google 也是如此)
用于比较,例如其中 3 是编码后的数字: -En&...-E2&E1&E0(因为二进制中的三是...000011)
希望对大家有帮助,加油!