Контекст: я использую руководство по программированию Z3: https://theory.stanford.edu/~nikolaj/programmingz3.html
Похоже, что в Z3 теперь есть встроенная поддержка транзитивного замыкания, но на данный момент он доступен только через Z3py: https://theory.stanford.edu/~nikolaj/programmingz3.html#sec-transitive-closure
У меня есть два вопроса:
(1) Есть ли какие-либо способы доступа к TransitiveClosure через другие API или к исполняемому файлу напрямую через "z3 -in", или это только для Z3py намомент?
(2) Должен ли TransitiveClosure взаимодействовать с push и pop?Ранее мы построили основную ветку на этой неделе (commit 2788f72bbb6bfd6bdad2da2b4c37ef1bb502469d) и запустили следующий пример:
from z3 import *
B = BoolSort()
S = DeclareSort('S')
a, b, c = Consts('a b c', S)
R = Function('R', S, S, B)
TCR = TransitiveClosure(R)
s = Solver()
s.add(R(a, b) == True)
s.push() # If this line is uncommented (or both are) the result is sat, which is wrong.
s.add(TCR(a, b) == False)
s.push() # But if THIS line is uncommented (or neither are), the result is unsat, which is correct.
print(s)
print(s.check())
Как показывают комментарии, вызов push () между утверждениями о R и его транзитивным замыканием, кажется, нарушаетсвязь между двумя отношениями.Не уверен, что это ошибка или мое недоразумение ...