Какие придирки эквивалентны этим положениям?
Я использую Z3 и расширенный синтаксис SMT-LIB2 для решения моих предложений рог. Я знаю, что заголовок предложения рог должен быть неинтерпретируемым предикатом; но мне интересно, как мне переписать следующие пункты, чтобы они были набором предложений рог.
(declare-rel inv (Int Int ))
(declare-var k Int)
(declare-var k_p Int)
(declare-var a Int)
(declare-var a_p Int)
(rule (=> (and (= a 0) (= k 0)) (inv a k)))
(rule (=> (and (inv a k) (= a_p (+ a 1))(= k_p (+ k 1))) (inv a_p k_p)))
(rule (=> (and (inv a k) (> k 0) ) (> a 0)))
(query inv )
Z3 жалуется, что (> a 0)
не может быть главой статьи о роге. Я могу переписать последнее предложение следующим образом:
(rule (=> (and (inv a k) (> k 0) ) (gtz a)))
(rule (=> (> a 0) (gtz a)))
Но затем предложения становятся настолько слабыми, что я не могу получить предполагаемую модель для инварианта inv
. Интересно, есть ли лучший способ сделать это.
1 ответ
Решение
Может ты хочешь сказать
(declare-rel inv (Int Int ))
(declare-rel q ())
(declare-var k Int)
(declare-var k_p Int)
(declare-var a Int)
(declare-var a_p Int)
(rule (=> (and (= a 0) (= k 0)) (inv a k)))
(rule (=> (and (inv a k) (= a_p (+ a 1))(= k_p (+ k 1))) (inv a_p k_p)))
(rule (=> (and (inv a k) (> k 0) (not (> a 0))) q))
(query q )