如何在Z3 Fixedpoint中获得多个约束?

时间:2014-05-29 06:45:47

标签: z3 fixed-point

运行片段时

(declare-rel mypred (Int Int))
(declare-var A Int)
(declare-var B Int)
(declare-var C Int)
(rule (mypred 1 0))
(rule (mypred 2 1))
(rule (mypred 3 2))
(rule (mypred 4 3))
(rule (mypred 5 4))
(rule (=> (and (mypred C B) (mypred A C)) (mypred A B)))

(query (and (mypred C 2) (mypred 2 B) (mypred B A))
  :print-answer true
)
(query (mypred A 2)
  :print-answer true
)
<3>在z3中(例如在rise4fun http://rise4fun.com/Z3/上),我得到了答案:

sat
(and (query!0 1 1 3) (mypred 2 1) (mypred 3 2) (mypred 1 0))
sat
(and query!16!slice!18 (mypred!slice!17 2))

正如预期的那样,两个查询都可以得到满足并且Z3正确地报告了这一点,但我也想知道它们满足哪些A,B,C值,但答案并没有提供直接答案。< / p>

“query!0”的参数似乎与原始查询中使用的参数不同,并且答案的第二部分仅在重新排序后与原始查询匹配。我实际上是用.NET API编写的,所以我可以检查AST,但我想避免尝试将原始查询的每个元素与答案中的每个元素相匹配(例如,如果有办法保持秩序,我会很高兴。)

可以通过多种方式满足第二个查询。我目前没有兴趣找到其中一个(虽然这也可能有用),但我想知道一种方法来自动区分它与查询具有唯一解决方案的情况。

这是否可以通过Z3固定点实现?我怎样才能做到这一点? (我已经看到多个问题得到了约束,但我无法弄清楚确切的符号&lt; - &gt;值匹配)

1 个答案:

答案 0 :(得分:0)

关于你提出的建议有两点要说:

  • 您在rise4fun上使用的Z3版本在您提供的情况下提供了非信息性的答案。检入不稳定分支的版本(在不同平台上自动构建)产生答案:

    (和(mypred 3 2)(mypred 1 0)(mypred 2 1))

    (mypred 3 2)

  • 我没有一个满意的解决方案来显示A | - &gt;形式的绑定。对不起。