Какие придирки эквивалентны этим положениям?

Я использую 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 )
Другие вопросы по тегам