在Z3中迭代地改进模型

时间:2014-01-29 00:55:06

标签: c++ z3

这个问题是对以下问题的跟进:

Building custom theories in Z3

正如Nikolaj建议的那样,我实现了一种惰性循环方法,但我对此有一些疑问。

1。 我正在使用模型类的get_func_interp函数来获取Z3给我的自定义谓词的解释。它在大多数情况下都能正常工作,但有时,解释是根据Z3生成的其他函数定义的(以下示例)

型号:

(define-fun path1() Int 712)

(define-fun path2 () Int
  38)
(define-fun z3contians ((x!1 Int) (x!2 Int)) Bool
  true)
(define-fun k!15 ((x!1 Int)) Int
  (ite (= x!1 1) 1
    0))
(define-fun z3connects!16 ((x!1 Int) (x!2 Int) (x!3 Int)) Bool
  (ite (and (= x!1 712) (= x!2 0) (= x!3 1)) true
  (ite (and (= x!1 38) (= x!2 1) (= x!3 5)) true
    false)))
(define-fun k!13 ((x!1 Int)) Int
  (ite (>= x!1 712) (ite (>= x!1 1001) 1001 712) 38))
(define-fun k!14 ((x!1 Int)) Int
  (ite (= x!1 1) 1
    5))
(define-fun z3connects ((x!1 Int) (x!2 Int) (x!3 Int)) Bool
  (z3connects!16 (k!13 x!1) (k!15 x!2) (k!14 x!3)))

在这些情况下,getg_func_interp函数似乎不够用。我无法迭代函数的所有可能输入并使用eval,因为我不知道该函数的非默认情况的数量。

2。 在使用惰性循环方法时,我注意到Z3有时会错过正确的模型,因为它试图改变不需要真正改变的值。我写了一个小例子来说明这个案例:

(declare-fun path1 () Int)
(declare-fun path2 () Int)
(declare-fun pred1 (Int) Bool)
(declare-fun pred2 (Int) Bool)
(assert (pred1 path1))
(assert (pred2 path2))
(check-sat)
(get-model)

现在,如果我们认为pred1(x)是(x == 12),而pred2(x)是(x == 11),我们可以看到Z3永远不会得到模型,因为它总是只报告模型有(path1 = 1,path2 = 2),(path1 = 2,path2 = 3)...(path1 = 10,path2 = 11),(path1 = 11,path2 = 12)....等等。我可以指定一种策略来防止这种情况吗?我确实理解这不是特定于工具的问题,但任何见解都会有所帮助。

0 个答案:

没有答案