∃-查询和∀-使用Z3定点引擎进行查询
我很困惑,很难理解Z3 fixedpoint引擎的两种不同输入格式是如何关联的。简短的例子:假设我想证明负数的存在。我声明了一个函数,对于非负数返回1,对于负数返回0,然后如果存在函数返回0的参数,则要求解算器失败。但有一个限制:当至少存在一个负数时,我希望解算器响应∃-查询和∀-使用Z3定点引擎进行查询,z3,smt,Z3,Smt,我很困惑,很难理解Z3 fixedpoint引擎的两种不同输入格式是如何关联的。简短的例子:假设我想证明负数的存在。我声明了一个函数,对于非负数返回1,对于负数返回0,然后如果存在函数返回0的参数,则要求解算器失败。但有一个限制:当至少存在一个负数时,我希望解算器响应sat,如果所有数字都是非负数,则响应unsat 使用declare rel和query格式非常简单: (declare-rel f (Int Int)) (declare-rel fail ()) (declare-var n I
sat
,如果所有数字都是非负数,则响应unsat
使用declare rel
和query
格式非常简单:
(declare-rel f (Int Int))
(declare-rel fail ())
(declare-var n Int)
(declare-var m Int)
(rule (=> (< n 0) (f n 0)))
(rule (=> (>= n 0) (f n 1)))
(rule (=> (and (f n m) (= m 0)) fail))
(query fail)
返回unsat
。毫不奇怪,将(=m0)
更改为(=m1)
的结果是相同的。我们可以从(=m2)
获得sat
,这只意味着fail
。问题是我不明白如何使用这种格式询问解算器
我现在是如何理解它的,而使用for all
-表单我们只能要求查找∀-解决方案,即回答sat
意味着解算器设法找到满足all值所有断言的解释(或不变),而unsat
意味着不存在此类函数。换句话说,它试图证明,将“证明”(不变量)放入模型中(显然,当sat
时)
相反,当query
在declare rel
格式解算器中搜索解决方案以查找某些变量时,就像约束在∃-量词。换句话说,它给出了反例。它只能在unsat
的情况下打印不变量
我有几个问题:
(assert(forall…)
表达(query…)
的一般概念将非常有用(并将自动回答问题2)sat
)?如果是,那怎么办首先,使用“declare rel”、“declare var”、“rule”和“query”的格式是SMT-LIB2的自定义扩展。“declarevar”特性便于从多个规则中省略绑定变量。它还允许使用分层否定来制定数据日志规则,其语义是您应该从分层否定中得到的。按照惯例,它使用“sat”表示查询有派生,而“unsat”表示查询不存在派生 事实证明,标准SMT-LIB2几乎可以表达您想要的内容 没有否定的从句。规则成为含义,而查询是形式的含义:(=>queryfalse),或者是您编写的形式(而不是查询)。 自定义格式的派生对应于空子句的证明(例如,“查询”的证明,然后证明为“false”)。因此,派生的存在意味着SMT-LIB2断言是“unsat”。相反,如果对Horn子句有解释(模型),则该模型确定不存在派生。这些条款是“sat” 换言之:
"sat" for datalog extension <=> "unsat" for SMT-LIB2 formulation
"unsat" for datalog extension <=> "sat" for SMT-LIB2 formulation
SMT-LIB2配方的数据日志扩展“unsat”的“sat”
SMT-LIB2配方的数据日志扩展“sat”的“unsat”
使用纯SMT-LIB2格式的优点是
没有特殊的语法扩展。这些是简单的SMT公式和
其他想要解决这类公式的人不必写特殊的公式
扩展时,他们只需确保已调整的解算器
Horn子句识别适当的公式类别。(Z3的实施
HORN片段的定义允许在写HORN子句时有一定的灵活性。
你可以在身体中有分离,你可以有咖喱的含义)
使用SMT-LIB2格式有一个缺点,基于规则的格式有助于解决这一缺点:当存在查询派生时,基于规则的格式具有用于打印元组元素的杂注。请注意,通常查询关系可以采用参数。此功能对于有限域关系非常有用。
上面的示例使用整数,因此关系不是有限域,但在线教程中的示例包含有限域实例。
现在,查询的派生也对应于解析证明。您可以从SMT-LIB2案例中提取一个解决方案证明,但我不得不说,它相当简单
令人费解,我还没有找到一种有效使用它的方法。Horn子句的“对偶性”引擎以比Horn子句更容易访问的格式生成派生
Z3的默认证明格式。无论哪种方式,如果用户尝试使用验证证书,很可能会遇到障碍,因为它们很少被使用。基于规则的格式还有另一个特性,它将一组谓词与对应于派生线索的实例组合在一起。首先,使用“declare rel”、“declare var”、“rule”和“query”的格式是SMT-LIB2的自定义扩展。“declarevar”特性便于从多个规则中省略绑定变量。它还允许使用分层否定来制定数据日志规则,其语义是您应该从分层否定中得到的。按照惯例,它使用“sat”表示查询有派生,而“unsat”表示查询不存在派生 事实证明,标准SMT-LIB2几乎可以表达您想要的内容 没有否定的从句。规则成为含义,而查询是形式的含义:(=>queryfalse),或者是您编写的形式(而不是查询)。 自定义格式的派生对应于空子句的证明(例如,“查询”的证明,然后证明为“false”)。导数的存在性
"sat" for datalog extension <=> "unsat" for SMT-LIB2 formulation
"unsat" for datalog extension <=> "sat" for SMT-LIB2 formulation