Z3 ";“拉嵌套量词”;在UFBV的上下文中,选项似乎会导致问题?

Z3 ";“拉嵌套量词”;在UFBV的上下文中,选项似乎会导致问题?,z3,smt,Z3,Smt,我目前正在试验Z3作为用Alloy(一种关系逻辑/语言)编写的规范的有界引擎。我使用UFBV作为目标语言 我使用Z3选项(set选项:pull嵌套量词true)检测到问题 对于两个语义相同的SMT规范Spec1和Spec2,Z3超时(200秒)以证明Spec1,但证明Spec2 Spec1和Spec2之间唯一的不同是它们具有不同的函数标识符(因为我使用java哈希名称)。这可能与bug有关吗 我想分享和讨论的第二个观察结果是UFBV上下文中的“iff”操作符。如果设置了(设置逻辑UFBV),则不

我目前正在试验Z3作为用Alloy(一种关系逻辑/语言)编写的规范的有界引擎。我使用UFBV作为目标语言

我使用Z3选项
(set选项:pull嵌套量词true)
检测到问题

对于两个语义相同的SMT规范Spec1和Spec2,Z3超时(200秒)以证明Spec1,但证明Spec2

Spec1和Spec2之间唯一的不同是它们具有不同的函数标识符(因为我使用java哈希名称)。这可能与bug有关吗

我想分享和讨论的第二个观察结果是UFBV上下文中的“
iff
”操作符。如果设置了
(设置逻辑UFBV)
,则不支持此运算符。我的解决方案是改为使用“=”,但如果操作数包含深度嵌套的量词,并且设置了“
pull-nested-quantifiers
”,则此方法不起作用。另一个解决方案是使用双重含义

现在的问题是: 对于UFBV中的模型“
iff
”,还有其他更好的解决方案吗?因为我认为,使用双重蕴涵通常会释放出可用于改进/简化的语义信息


您可以找到:spec1和spec2是两个(我认为)语义相同的SMT规范,spec3是一个使用“=”对“
iff
”建模的SMT规范,其中z3超时。
UFBV
逻辑的默认策略对您的问题无效。实际上,默认策略在不到1秒的时间内解决了所有问题。要强制Z3使用默认策略,只需在脚本中注释以下行

; (set-logic UFBV)
; (set-option :pull-nested-quantifiers true)
; (set-option :macro-finder true)
如果警告消息困扰您,您可以添加:

(set-option :print-warning false)
话虽如此,我将努力解决你提出的问题。 标识符名称是否影响Z3的行为?是的,有。 从3.0版开始,我们开始对Z3表达式使用总顺序来执行操作,例如:对关联交换运算符的参数进行排序。 此总订单基于标识符名称。 具有讽刺意味的是,这种修改是由用户反馈引起的。在以前的版本中,我们在许多不同的启发式算法中使用内部ID来执行排序和断开联系等操作。但是,这些ID基于Z3创建/删除表达式的顺序,该顺序基于用户声明符号的顺序。因此,Z32.x的行为会受到诸如删除未使用声明之类的琐碎修改的影响


关于iff,它不是SMT-LIB 2.0标准的一部分。在SMT-LIB 2.0中,
=
用于公式和术语。为了确保Z3完全符合SMT-LIB 2.0标准,每当用户指定SMT-LIB支持的逻辑(或即将支持的逻辑,如UFBV)时,Z3仅“加载”其中定义的符号。当未指定逻辑时,Z3假设用户使用的“Z3逻辑”包含Z3中所有支持的理论,以及许多额外的
别名
,例如:
iff
用于布尔
=
if
用于
ite
,等等。

是的,对于默认策略,这些基准很容易解决,但对于UFBV策略,如果禁用了拉嵌套量词,也会出现这种情况。如果您感兴趣,我在同一链接上发布了其中一个基准的扩展版本,这两种策略都很难解决(位大小>=3时超时)。关于Z3行为对符号名称的依赖性。我使我的ids泛化独立于java哈希代码(使用SMT-LIB在“|”)之间定义任意字符串的可能性。但是,现在我想知道,对于如何生成好的符号/顺序,是否有任何规则或启发法。