Учитывая формулу Z3 в CNF, можно ли преобразовать ее в представление списка списков с помощью Z3Py? Я хотел бы сделать это для облегчения доступа и манипулирования литералами. Если Python был функциональный язык, я мог бы сделать что-то вродеПреобразование Z3 формулы CNF в представление списка списков с использованием Z3Py
def cnf2list(fm) :
match fm with
| And(P,Q) -> cnf2list(P) + cnf2list(Q)
| P -> clause2list(P)
def clause2list(fm) :
match fm with
| Or(P,Q) -> clause2list(P) + clause2list(Q)
| P -> [P]
Но я не уверен, что я могу сделать это в Python. Возможно ли выполнить сопоставление с образцом, как указано выше (или использовать какой-то совсем другой метод), чтобы получить представление списка рецептов формулы Z3 CNF?
Это неизбежное следствие пользовательской '__eq__'. –
Список тестов на членство 'x in xs' примерно эквивалентен' any (bool (x == el) для el в xs) ', а' bool (<некоторое выражение Z3>) 'всегда истинно в соответствии с [этими правилами] (https://docs.python.org/3/reference/datamodel.html#object.__bool__). Такое поведение, безусловно, не является достаточно проблематичным, чтобы пожертвовать удобством символического '==', но я думаю, что небольшое улучшение возможно. Подумайте о том, чтобы добавить метод '__bool__', который генерирует исключение, чтобы предотвратить такое использование в целом. Я почти уверен, что большинство случаев, когда символическое булевское выражение используется в конкретном булевом контексте, являются ошибками. –
Это здорово, спасибо за объяснение, что @VladShcherbina! Я добавлю метод __bool__. –