Если я даю Z3 формулу, такую как p | q, я ожидал бы, что Z3 вернет p = true, q = не волнует (или с переключением p и q), но вместо этого он, похоже, настаивает на назначении значений как p, так и q (даже если у меня нет завершенного завершения при звонке Eval()
). Кроме того, удивляясь этому, тогда мой вопрос заключается в том, что, если p и q не являются простыми опорами. vars, но дорогие выражения, и я знаю, что обычно p или q будут истинными. Есть ли простой способ попросить Z3 вернуть «минимальную» модель и не тратить время на попытки удовлетворить как p, так и q? Я уже пробовал MkITE
, но это не имеет значения. Или мне нужно использовать какую-то тактику для обеспечения этого?Как мне получить Z3 для возврата минимальной модели?
спасибо! PS. Я хотел добавить, что я отключил AUTO_CONFIG, но Z3 пытается назначить значения константам в обеих ветвях или: например, в фрагменте ниже. Я хочу, чтобы он назначал либо путь2_2, либо путь2_1 или путь2R_2 и path2R_1, но не оба
(or (and (select a!5 path2_2) a!6 (select a!5 path2_1) a!7)
(and (select a!5 path2R_2) a!8 (select a!5 path2R_1) a!9))
Примечание: Пример, приведенный здесь не работает в последних версиях Z3, но он работает, когда вместо Solver() используется SimpleSolver(). См. Также здесь: http://stackoverflow.com/questions/28289410/z3-eliminate-dont-care-variables/28302963 –