Значения кванторов существования в Z3

Скажем, я пишу простой код с квантификаторами, как показано ниже:

from z3 import *
s = SolverFor("LIA")
x1, y1 = Ints('x1 y1')
s.add(ForAll(x1, Implies(x1>=0, Exists(y1, (y1>x1)))))

печать (s.check()) печать (s.model())

Результат:

sat
[ ]

Разве это не должно выводить значение y1, для которого оно выполнимо?


person hemlata d'souza    schedule 17.12.2019    source источник


Ответы (1)


И что это будет за значение? Обратите внимание, что значение y1 зависит от x1 в вашей формуле, поэтому не имеет смысла печатать только y1.

В общем, как только вы зайдете под универсальный квантор, z3 больше не сможет печатать значения переменных. Чтобы сделать это осмысленно, ему пришлось бы печатать все универсальные префиксы, и если бы все ваши домены не были конечными, это не имело бы смысла. (И это было бы полезно.)

person alias    schedule 17.12.2019
comment
Я согласен с вашей точкой зрения. Но что произойдет, если квантор всеобщего находится под квантором существования? Получим ли мы тогда значения переменных под квантором существования? - person hemlata d'souza; 18.12.2019
comment
Почему бы вам не попробовать и сообщить нам, что вы узнали! В общем, префиксные экзистенциалы можно вытащить на верхний уровень и таким образом получить значение, пусть даже косвенное. - person alias; 18.12.2019
comment
Далее обратите внимание, что имена связанных переменных не обязательно уникальны, поэтому их будет трудно идентифицировать. Лучшее решение этой проблемы — скулемизовать формулу перед передачей ее в Z3, тогда функции Скулема можно будет назвать подходящим образом. - person Christoph Wintersteiger; 20.12.2019