∃-查询和∀-使用Z3定点引擎进行查询

∃-查询和∀-使用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

我很困惑,很难理解Z3 fixedpoint引擎的两种不同输入格式是如何关联的。简短的例子:假设我想证明负数的存在。我声明了一个函数,对于非负数返回1,对于负数返回0,然后如果存在函数返回0的参数,则要求解算器失败。但有一个限制:当至少存在一个负数时,我希望解算器响应
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)
  • 有没有办法解决这样的问题∃-使用纯SMT-LIB2格式的约束(找到反例时输出
    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