Я думаю, что есть два различных соответствующих случаев здесь:Каков наиболее эффективный способ кодирования псевдобулевых ограничений в z3?
Случай 1:
У меня есть набор логических переменных, и я хочу другую логическую переменную, которая является истинным, если любой из этих переменных являются истинными. Я сейчас делаю это, делая логические переменные целые числа, которые затем установить с помощью выражения вида:
(ITE (boolean_expr) 1 0)
Я тогда установить общий булево используя только сумму и большее, чем
(> (+ b1 b2 b3 ...) 0)
Случай 2 (это не может быть действительно псевдобулева):
у меня есть два набора логических переменных:
set1 = n_1, n_2 ....
set2 = m_1, m_2 ....
Я хотел бы добавить ограничение: количество переменных, заданной истину в set1 равно к числу, установленному в true в set2.
Как и выше, я в настоящее время делаю это с помощью целых чисел вместо Булевых и установки каждых из них с Внутриушными формами:
n_1 = (ITE (boolean_expr) 1 0)
, а затем говоря, что:
n_1 + n_2 + .... = m_1 + m_2 ......
в каждом случае используется целочисленных переменных наиболее эффективный способ сделать это, или есть лучший способ ?
Спасибо.