这个问题是对以下问题的跟进:
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)....等等。我可以指定一种策略来防止这种情况吗?我确实理解这不是特定于工具的问题,但任何见解都会有所帮助。