Во время моих заданий для теоретического 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, который возвращает истину только и только если k или меньше из заданных n верны.
Для примера, если мы допустим, что k = 1, формула соответствует NAND-функции:
(x1, x2) <= 1 </sup> = NOT (x1 AND x2)
(x1, x2, x3) <= 1 </sup> = НЕ ((НЕ (x1 И x2)) И x3),,.
Пока вопрос в том, как формула изменится, если k увеличится ...
Также довольно очевидная связь:
(x1, x2, ..., xn) <= k </sup> = (x1, ..., xn) = k ИЛИ (x1, ..., xn) = k-1 ИЛИ ... ИЛИ (x1, ..., xn) <= 1 </sup>