我有两个SMT问题实例。第一个是:
http://gist.github.com/1232766
Z3在我不太好的机器上大约2分钟就返回了这个问题的模型,这很棒..我也有这个:
http://gist.github.com/1232769
我在这个问题上一夜之间跑了z3,没有完成Z3。如果检查这些文件的内容,您将看到第二个文件的内容与第一个文件的内容相同,只是它有一个额外的断言来“拒绝”第一个实例返回的模型。 (你可以在它们之间做一个“差异”来看看我的意思。)我碰巧知道这个问题有多个令人满意的模型,而我正在尝试用z3来找到所有令人满意的模型。
我知道这可能是完全可以预料到的,但我很想知道为什么第二个问题与第一个问题相比,Z3的问题要严重得多。是否有更好的方法来制定第二个问题,以便Z3有更轻松的时间?
谢谢..
答案 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秒。