如何解释Z3';解决下列Horn子句时的行为?

如何解释Z3';解决下列Horn子句时的行为?,z3,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 HOR

我使用来自不稳定分支的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 )

谢谢。

我正在用Z3(在线和本地)执行您的示例1,我正在获得

WARNING: unknown logic, ignoring set-logic command 
sat 
(model (define-fun C () Int 3) )
sat
( (C 3) )
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) 
 )

我正在使用mathsat(本地)执行您的示例2,并获得

WARNING: unknown logic, ignoring set-logic command 
sat 
(model (define-fun C () Int 3) )
sat
( (C 3) )
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) 
 )

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

WARNING: unknown logic, ignoring set-logic command 
sat 
(model (define-fun C () Int 3) )
sat
( (C 3) )
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) 
 )

感谢您的尝试,但请注意,我的问题涉及Z3的PDR引擎,用于解决horn条款。(设置逻辑喇叭)部分很重要。这些例子很可能适用于其他引擎——在您的情况下就是这样。