Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3应该能够验证这个程序吗?_Z3_Smt - Fatal编程技术网

Z3应该能够验证这个程序吗?

Z3应该能够验证这个程序吗?,z3,smt,Z3,Smt,我是Z3的初学者。最近,我一直在使用z3来验证一些问题。我试过一个问题:(x

我是Z3的初学者。最近,我一直在使用z3来验证一些问题。我试过一个问题:(x<0&&y<0)意味着x/y>=0,下面是我编写的程序:

(declare-const x Int)
(declare-const y Int)
(define-fun assumption() Bool
  (and (< x 0) (< y 0))
)

(define-fun predicate() Bool
  (<= 0 (div x y))
)

(assert (not (=> assumption predicate)))

(check-sat)
(声明常量x Int)
(声明常数y Int)
(定义有趣的假设
(和(
当我使用'z3-smt2 filename'来验证这个程序时,它工作并返回unsat。但是,当我稍后将程序修改为:

(declare-const x Int)
(declare-const y Int)
(define-fun assumption() Bool
  (and (< x 0) (< y 0))
)

(define-fun predicate() Bool
  (<= 0 (div (* -1 x) (* -1 y)))
)

(assert (not (=> assumption predicate)))

(check-sat)
(声明常量x Int)
(声明常数y Int)
(定义有趣的假设
(和(
当我将'x/y'更改为(-1*x)/(-1*y)时,这会导致z3超时,不知何故,我需要在那里添加-1。我不明白为什么会发生这种情况,为什么乘以一个常数会使这个问题变得更复杂

有人能帮我弄清楚为什么会这样吗


谢谢大家!

对非线性算术的支持非常有限,例如除法,除数是一个变量。 因此,Z3将尽最大努力,但决不能保证在每个公式上都提供非线性算术运算的决策。例如,您可以将丢番图方程输入Z3,但不希望它提供sat/unsat答案。 Z3可能宁愿放弃并返回未知,而不是尝试无限搜索

(注意:这只是一个评论而不是答案。我必须这样做,因为我没有足够的声誉来添加评论。)

以下是关于整数除法、模和提醒运算符的引用:

Z3还支持除法、整数除法、模和余数运算符。在内部,它们都映射到乘法

在Z3中,允许除以零,但未指定结果。除法不是一个局部函数。事实上,在Z3中,所有函数都是合计的,尽管在某些情况下,如除零,结果可能不够具体

当争论是否定的时,不清楚什么是行为。换句话说,这些操作到乘法的映射并不清楚

(declare-const a Int)
(declare-const r1 Int)
(declare-const r2 Int)
(declare-const r3 Int)
(declare-const r4 Int)
(declare-const r5 Int)
(declare-const r6 Int)
(assert (= a 10))
(assert (= r1 (div a 4))) ; integer division
(assert (= r2 (mod a 4))) ; mod
(assert (= r3 (rem a 4))) ; remainder
(assert (= r4 (div a (- 4)))) ; integer division
(assert (= r5 (mod a (- 4)))) ; mod
(assert (= r6 (rem a (- 4)))) ; remainder
(declare-const b Real)
(declare-const c Real)
(assert (>= b (/ c 3.0)))
(assert (>= c 20.0))
(check-sat)
(get-model)