这个问题与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=false
和model-completion=true
,但没有成功。我也试图强制模型完成询问(主题Action0)的值,但Z3仍然没有为主题分配解释。
我的Z3版本是在Linux amd64上运行的4.3.1。
答案 0 :(得分:3)
参数:model-completion
的问题已修复。该修复程序已在http://z3.codeplex.com/SourceControl/changeset/a895506dac75处提供。
该修复程序将在下一个正式版本中提供。
如果需要,可以下载unstable
(正在进行中)分支,并进行编译。要下载,您只需要点击上面链接中的Download
按钮。
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完成模型:
换句话说,使用
(eval <term> :model-completion true)
而不是
(eval <term>)
另一种不同的方法是确保您要评估的字词包含在原始模型中:http://rise4fun.com/Z3/Yukv