如何解释Z3在解决以下Horn条款时的行为?

时间:2013-11-29 15:05:56

标签: z3

我使用不稳定分支中的Z3来试验Horn子句(commit 61385c8489b7fda11b518a67fe308ea3cfe28c3d)。我可以让Z3推断一些循环不变量,这很好。然而,通过以下简单示例,我对Z3的行为感到困惑。我在这里缺少什么?

示例1:

(set-logic HORN)
(declare-const C Int)
(assert (> C 2))
(check-sat)
(get-model)

我期待一个模型,但收到“未知”。

示例2:

(set-logic HORN)
(define-fun step ((I Int) (I1 Int)) Bool (= I1 (+ I 1)))
(define-fun post ((I1 Int)) Bool (= I1 10))
(declare-fun pre (Int) Bool)
(assert (forall ((I Int) (I1 Int)) (=> (and (pre I) (step I I1)) (post I1))))
(check-sat)
(get-model)

我希望有一个模型可以告诉我一些关于pre的信息(例如,它是假的,或者说它适用于9),但是接收

sat
(model )

感谢。

2 个答案:

答案 0 :(得分:0)

我正在使用Z3(在线和本地)执行示例1,我正在获取

WARNING: unknown logic, ignoring set-logic command 
sat 
(model (define-fun C () Int 3) )

我正在使用mathsat(本地)执行示例2,我正在获取

sat
( (C 3) )

答案 1 :(得分:0)

我正在使用Z3(在线和本地)执行示例2,我正在获取

WARNING: unknown logic, ignoring set-logic command 
sat 
(model 
 (define-fun elem!0 () Int 0) 
 (define-fun elem!1 () Int 0) 
 (define-fun pre ((x!1 Int)) Bool false) 
 )