我最近观察到Z3中有关触发的几种行为,我不明白.不幸的是,这些例子来自大型Boogie文件,所以我想我现在抽象地描述它们,只是为了看看是否有明显的答案.但是,如果具体文件会更好,我可以附加它们.
基本上有三个问题,尽管第三个可能是第二个问题的特例.据我所知,没有任何行为是预期的,但也许我错过了一些东西.任何帮助将不胜感激!
首先:就触发而言,我的程序中的琐碎平等似乎被忽略了.例如,if t1是一个应该与量化公理的模式匹配的术语,如果我在表单的Boogie程序中添加一行
assert t1 == t1;
Run Code Online (Sandbox Code Playgroud)
然后t1似乎没有被用作量化公理的触发器.我明确地添加了这一行,以便为t1证明者提供触发器,我经常在Boogie程序中做/做.
相反,如果我引入了额外的功能,比方说
function f(x : same_type_as_t1) : bool
{ true }
Run Code Online (Sandbox Code Playgroud)
现在改为添加一行
assert f(t1);
Run Code Online (Sandbox Code Playgroud)
我的节目,然后t1 就似乎被用来作为Z3的触发器.我检查了前程序的Z3翻译,并且(平凡的)平等t1确实在Boogie翻译中存活下来(即,不是Boogie尝试做一些聪明的事情).
其次:次要模式似乎对我不起作用.例如,我有一个程序,其中一个公理有形式
axiom (forall ... :: {t1,t2} {t3,t4,t5} ..... );
Run Code Online (Sandbox Code Playgroud)
和一种情况,t3, t4并t5都发生了.程序无法验证,显然是因为公理没有实例化.但是,如果我重写公理为
axiom (forall ... :: {t3,t4,t5} {t1,t2} ..... );
Run Code Online (Sandbox Code Playgroud)
然后程序验证.在这两种情况下,运行Boogie的时间大约为3秒,并且模式可以存活到Z3输出.
第三:这很可能是第二个问题的症状,但我对以下行为感到惊讶:
我写了这个形式的公理
axiom (forall .. :: {t1,t2} .... );
axiom (forall ... :: {t2,t4} {t2,t3} ...some expression involving …Run Code Online (Sandbox Code Playgroud) 我想将Scala val定义为String,其值是文本文件的全部内容,在编译时读取.因此,在编译之后,这应该只是表现为字符串常量.
我觉得这应该是简单的,例如,Scala宏,但到目前为止,我无法弄清楚如何简单地获取String值.