Поддерживает ли z3 рациональную арифметику для своих входных ограничений?
На самом деле, стандарт SMT-LIB имеет рациональную (а не только реальную) сортировку? Судя по его сайту, это не так.
Если x рационально и у нас есть ограничение x^2 = 2, то мы должны получить обратно "неудовлетворительно". Самое близкое, что я мог получить к кодированию этого ограничения, это следующее:
;;(set-logic QF_NRA) ;; intentionally commented out
(declare-const x Real)
(assert (= (* x x) 2.0))
(check-sat)
(get-model)
для которого z3 возвращает решение, поскольку в реалах есть решение (иррациональное). Я понимаю, что у z3 есть своя рациональная библиотека, которую он использует, например, при решении ограничений QF_LRA с использованием адаптации алгоритма Simplex. Относительно примечания, есть ли решатель SMT, который поддерживает рациональные значения на входном уровне?
1 ответ
Я уверен, что можно определить сортировку Rational, используя два целых числа, как предложил Николай, - мне было бы интересно это увидеть. Возможно, будет проще использовать реальную сортировку, и в любое время, когда вы захотите рационально, утверждать, что она равна отношению двух целых. Например:
(set-option :pp.decimal true)
(declare-const x Real)
(declare-const p Int)
(declare-const q Int)
(assert (> q 0))
(assert (= x (/ p q)))
(assert (= x 0.5))
(check-sat)
(get-value (x p q))
Это быстро возвращается с
sat
((x 0.5)
(p 1)
(q 2))