Z3 здесь правильно; Сценарий, который вы изложили, действительно unsat
. Вот что вы сказали:
Это явно не так для всех t_ss1
и t_ss3
. Не существует ss1
и ss3
, которые бы удовлетворяли этому для ALL t_ss1
и t_ss2
. Вам нужно только взглянуть на самое последнее предложение: вы не можете ожидать, что все t_ss3
будут равны произвольным ss3
.
Я подозреваю, что вы пытаетесь выразить какое-то другое свойство; но вы не правильно его кодировали. Может быть, вы пытались сказать, если t_ss1
равно ss1
и t_ss3
равно ss3
и t_ss1 < t_ss3
, тогда ss1 < ss3
? Это будет закодировано следующим образом:
(declare-const ss1 Int)
(declare-const ss3 Int)
(assert (forall ((t_ss3 Int) (t_ss1 Int))
(=> (and (< t_ss1 t_ss3)
(= t_ss1 ss1)
(= t_ss3 ss3))
(< ss1 ss3))))
(check-sat)
и действительно даст sat
.
Если вы придумаете лучшее описание того, что вы пытаетесь выразить, вы можете получить лучшую помощь в его моделировании в SMT-Lib по другому вопросу.