给定n个布尔变量,如何仅通过命题演算来检查k个或更少的k是否成立?

时间:2019-06-16 13:31:19

标签: boolean-logic propositional-calculus

在分配理论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

1 个答案:

答案 0 :(得分:0)

一个简单的公式如下:

f(S) = not [ OR(for T in S^(k+1)) [ AND(for t in T) t ] ]

在上面:

  • OR是从集合中计算出的所有项的重复逻辑或。
  • S ^(k + 1)是S的所有(k + 1)个子集的集合
  • AND是根据集合计算出的所有项的重复逻辑AND。

想法是这样的:

  

只有并且只有当不是至少k + 1为真时才是k或更少。当且仅当正好k + 1的某个子集全部为真时,至少k + 1才为真。