【发布时间】:2017-11-24 15:40:46
【问题描述】:
我对使用 Z3 有点迷茫,目标是模型 2 进程都并行运行相同的循环。只要两个进程都没有完成,就会选择一个未完成的进程并执行其 10 个步骤中的下一个:
for i := 1 to 10 do
if x < 8 then x := x + i else x := i − 2x
x 是一个全局变量,i 在两个实例中都是局部变量。
另外我想将 x 初始化为 0,这在 Z3 中可以吗?
到目前为止,我得到了 unsat 的结果,代码如下:
(declare-const c Int)
(push)
(declare-const i1 Int)
(assert
(and
(>= i1 1)
(<= i1 20)
(ite (< c 5) (and (= c (+ c i1)) (>= i1 1) (<= i1 20)) (and (= c (- i1 (* 2 c))) (>= i1 1) (<= i1 20)))
))
(push)
(declare-const i2 Int)
(assert
(and
(>= i2 1)
(<= i2 20)
(ite (< c 5) (and (= c (+ c i2)) (>= i2 1) (<= i2 20)) (and (= c (- i2 (* 2 c))) (>= i2 1) (<= i2 20)))
))
(assert (= c -24))
(check-sat)
(get-model)
(pop)
(pop)
提前致谢!
【问题讨论】:
-
不太清楚你在问什么。你说“只要两个过程都没有完成”。他们什么时候完成?另外,你的目标是什么?计算所有交错下
x的最终值?