在分配理论CS的过程中,我偶然发现了布尔函数的外观问题,该函数测试n个给定的布尔变量,x1至xn,k或更少的变量是否为真。
在Java中,这将非常简单:
public boolean k_or_less_true(boolean[] x , int k) {
int num_true = 0;
int n = boolean.size;
for(int i = 0; i < n-1; i++){
if(x[i]){num_true++;}
}
return num_true <= k;
}
现在的问题是,通过依赖于n和k的命题演算来找到一个公式,该公式仅在给定的n中的k个或更少为真时才返回true。
举个例子,如果让k = 1,则公式对应于NAND函数:
(x1,x2) <= 1 = NOT(x1和x2)
(x1,x2,x3) <= 1 = NOT((NOT(x1 AND x2))AND x3)
。
。
到目前为止,问题是,如果k增加,公式将如何变化...
另外一个很明显的联系是:
(x1,x2,...,xn) <= k =(x1,...,xn) = k OR(x1,... ,xn) = k-1 或...或(x1,...,xn) <= 1
答案 0 :(得分:0)
一个简单的公式如下:
f(S) = not [ OR(for T in S^(k+1)) [ AND(for t in T) t ] ]
在上面:
想法是这样的:
只有并且只有当不是至少k + 1为真时才是k或更少。当且仅当正好k + 1的某个子集全部为真时,至少k + 1才为真。