Z3 用于SMT的所有用途

Z3 用于SMT的所有用途,z3,smt,z3py,Z3,Smt,Z3py,forall语句在SMT中是如何工作的?我找不到有关用法的信息。你能简单地解释一下吗?有一个来自 有关量词(以及所有其他SMTLib)的一般信息,请参阅官方SMTLib文档: 引用第3.6.1节: 存在并用于所有量词。这些粘合剂与通常的粘合剂相对应 一阶逻辑的普遍存在量词,除 他们量化的每个变量也与排序关联。二者都 绑定器有一个非空的变量列表,它缩写为 量词的顺序嵌套。具体来说,一个公式的形式 (因为所有((x1σ1)(x2σ2)···(xnσn))ψ)(3.1)具有相同的 作为公式的语义(

forall
语句在SMT中是如何工作的?我找不到有关用法的信息。你能简单地解释一下吗?有一个来自


有关量词(以及所有其他SMTLib)的一般信息,请参阅官方SMTLib文档:

引用第3.6.1节:

存在并用于所有量词。这些粘合剂与通常的粘合剂相对应 一阶逻辑的普遍存在量词,除 他们量化的每个变量也与排序关联。二者都 绑定器有一个非空的变量列表,它缩写为 量词的顺序嵌套。具体来说,一个公式的形式 (因为所有((x1σ1)(x2σ2)···(xnσn))ψ)(3.1)具有相同的 作为公式的语义(forall((x1σ1))(forall((x2σ2))(··· (对于所有((xnσn))ψ)···(3.2)注意列表中的变量 (3.1)的((x1σ1)(x2σ2)··(xnσn))不需要 然而,由于嵌套的量词 语义上,列表中同一变量的早期出现是 被最后一个事件所遮蔽,使这些较早的事件发生 无用。相同的参数适用于现有活页夹

如果你有一个量化的断言,这意味着解算器必须找到一个使公式为真的令人满意的实例。对于一个
forall
量词,这意味着它必须找到一个模型,该模型的断言对于相关种类的量化变量的所有赋值都为真。同样,对于
存在
模型需要能够展示满足断言的特定值

顶级
存在
量词通常在SMTLib中被忽略:通过skolemization,声明顶级变量可以满足需要,并且还具有在模型中自动显示的优势(即,任何顶级声明变量都会自动存在量化)

使用
forall
通常会使逻辑半可判定。因此,如果使用量词,你很可能会得到
unknown
作为答案,除非某些启发式方法可以找到令人满意的赋值。类似地,虽然语法允许嵌套量词,但大多数解算器将很难处理它们。模式可以帮助,总之,如果你使用量词,那么SMT解决方案就不再是决策程序:它们可能终止,也可能不终止

如果您使用的是用于z3的Python接口,还可以看看:。它确实包含一些量化示例,可以为您澄清一些事情。(即使您不使用Python接口,我也衷心建议您浏览该页面,看看这些功能是什么。它们或多或少会直接转换为SMTLib。)


希望您能从中开始。如果您提出特定问题,堆栈溢出效果最好,因此请根据需要对实际代码进行澄清。

从语义上讲,所有x:T.e(x)的量词相当于e(x_1)&&e(x_2)&……,其中x_i都是T类型的值。如果T有无限多个(或静态未知的多个)值,那么直觉上很清楚SMT解算器不能简单地将量词转换为等价的连词

本例中的经典方法是模式(也称为触发器),由Simplify首创,并在Z3和其他版本中提供。其思想相当简单:用户使用语法模式对量词进行注释,该模式为何时(以及如何)实例化量词提供启发

下面是一个示例(伪代码):

这里,
{foo(x)}
是模式,它向SMT解算器指示,只要解算器获得基本项
foo(某物)
,就应该实例化量词。例如:

assume forall x :: {foo(x)} foo(x) ==> 0 < x
assume foo(y)
assert 0 < y
这里,量词不会被实例化,因为基本术语
bar(y)
与所选模式不匹配

前面的例子表明,模式可能导致不完整,但是它们也会导致终止问题。请考虑这个例子:

assume forall x :: {foo(x)} (foo(x) || bar(x)) ==> 0 < y
assume bar(y)
assert 0 < y
assume forall x :: {f(x)} !f(x) || f(f(x))
assert f(y)
该模式现在允许一个匹配循环,这可能导致非终止。基本项
f(y)
允许实例化量词,从而产生基本项
f(y))
。不幸的是,
f(y))
匹配触发器(实例化
x
f(y)
),从而产生
f(f(y))

模式被许多人所畏惧,而且很难正确处理。另一方面,制定触发策略(给定一组量词,找到允许正确实例化的模式,但理想情况下不超过这些),最终“只”需要逻辑推理和规则

良好的起点是: *,第“量词”节 * * *,第“量词”节


Z3还提供了基于模型的量词实例化(MBQI),一种不使用模式的量词方法。据我所知,不幸的是,它的文档也很少,但Z3教程也有一小段关于MBQI的内容。

谢谢你的帮助。我已经阅读了这里提供的文档,并试图理解其背后的逻辑,有些文档太过理论化,我无法理解。我没有使用Python接口事实上,我在尝试实现“for-loop”时有一些先入为主的直觉,我认为“forall”和模式的使用可能是实现它的一种方式。我错了吗?实现for-loop的方式是什么?@bc_msa如何对循环的效果进行编码之前已经讨论过:例如,和。手动编码循环是一项工作量很大的工作如果使用中间验证语言(如、或)为您完成,则会大大简化。另请参阅我对此评论的看法。
assume forall x :: {foo(x)} (foo(x) || bar(x)) ==> 0 < y
assume bar(y)
assert 0 < y
assume forall x :: {f(x)} !f(x) || f(f(x))
assert f(y)