Z3:更好的模特方式?

时间:2011-09-21 17:51:22

标签: z3

我有两个SMT问题实例。第一个是:

http://gist.github.com/1232766

Z3在我不太好的机器上大约2分钟就返回了这个问题的模型,这很棒..我也有这个:

http://gist.github.com/1232769

我在这个问题上一夜之间跑了z3,没有完成Z3。如果检查这些文件的内容,您将看到第二个文件的内容与第一个文件的内容相同,只是它有一个额外的断言来“拒绝”第一个实例返回的模型。 (你可以在它们之间做一个“差异”来看看我的意思。)我碰巧知道这个问题有多个令人满意的模型,而我正在尝试用z3来找到所有令人满意的模型。

我知道这可能是完全可以预料到的,但我很想知道为什么第二个问题与第一个问题相比,Z3的问题要严重得多。是否有更好的方法来制定第二个问题,以便Z3有更轻松的时间?

谢谢..

1 个答案:

答案 0 :(得分:2)

如果不了解您的应用程序,很难给出准确的答案。 正如您所建议的,建模在您使用的逻辑中起着重要作用:AUFBV。 Z3使用的策略也对整体性能产生重大影响。 Z3配备了几种内置策略。它有许多参数可用于影响搜索。 Z3还有一种策略规范语言。这是一项新功能。我不是在宣传它,因为它正在进行中,语言很可能会在下一个版本中发生变化。 您可以通过执行命令来访问有关策略语言的更多信息:

(help check-sat-using)
(help-strategy)

话虽如此,Z3中的内置策略似乎对您的问题有效。 它是用于逻辑UFBV的策略。您的问题使用数组,但可以通过将table0转换为具有两个参数的函数来避免它们:

(declare-fun table0 ((_ BitVec 64) (_ BitVec 64)) (_ BitVec 8))

并将(select (table0 s65) t)格式的每个字词替换为(table0 s65 t),其中t是一个任意字词。 最后,还必须在文件的开头添加命令(set-logic UFBV)。通过此设置,我设法为您的查询生成4种不同的模型。 我没有尝试产生更多。每次通话消耗大约75秒。