Z3 4.3:获得完整的模型

时间:2013-01-25 14:55:17

标签: z3

这个问题与this one几乎相同,但解决方案对我不起作用。对不起,我想对这个答案发表评论,而不是问一个新问题,但我没有足够的声誉......

我正在建模a simple state machine for an elevator。有两层楼和两个按钮 Up Down 。我已将转换建模为谓词 Action x Elevator x Elevator (Elevator = State),以便 T(a,s,s')保持iff动作< em> a 可能会导致从 s 转换为 s',其中某个操作正在推送 Up 向下按钮。问题的可满足性并不取决于按下按钮的人,但我希望Z3为函数主题分配一些解释:动作 - &gt;人

目标是找到状态机的 k -trace,这可能有助于理解电梯的行为。

我尝试过不同的选项组合,包括auto-config=falsemodel-completion=true,但没有成功。我也试图强制模型完成询问(主题Action0)的值,但Z3仍然没有为主题分配解释。

我的Z3版本是在Linux amd64上运行的4.3.1。

2 个答案:

答案 0 :(得分:3)

参数:model-completion的问题已修复。该修复程序已在http://z3.codeplex.com/SourceControl/changeset/a895506dac75处提供。

该修复程序将在下一个正式版本中提供。 如果需要,可以下载unstable(正在进行中)分支,并进行编译。要下载,您只需要点击上面链接中的Download按钮。

BTW,新的Z3有一个新的参数设置框架,允许我们设置内部模块参数。在下一个版本中(以及unstable分支中)。我们必须使用

(set-option :model_evaluator.completion true)

而不是

(set-option :model_completion true)

因为我们正在设置模块model_evaluator的参数。 而且,我们必须使用

(eval <term> :completion true)

而不是

(eval <term> :model_completion true)

因为我们正在设置模型评估程序的参数completion

答案 1 :(得分:2)

很好的例子。 抽象排序Person没有出现在断言中, 并且返回Person的函数也没有在 断言。

您可以通过将参数直接传递给函数来强制eval完成模型:

http://rise4fun.com/Z3/Pslt4

换句话说,使用

   (eval <term> :model-completion true)

而不是

   (eval <term>)

另一种不同的方法是确保您要评估的字词包含在原始模型中:http://rise4fun.com/Z3/Yukv