在 Z3 中定义带有约束的代数数据类型

2024-01-11

我看过一些在线材料,用于定义代数数据类型,例如 Z3 中的 IntList。我想知道如何定义具有逻辑约束的代数数据类型。例如,如何定义代表正整数的 PosSort。


SMT中的全部功能

在 SMT 中函数总是完整的,这提出了如何对部分函数(例如数据类型构造函数)进行编码的问题PosSort。因此,如果 Z3/SMT 对代数数据类型的内置支持支持部分数据类型构造函数(并且SMT-LIB 2.6标准 http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf看来同意)。

偏函数编码:理论

然而,并非所有希望都破灭了,但您可能必须自己对 ADT 进行编码。假设一个总函数f: A -> B,它应该建模部分数据类型构造函数f': A ~> B都属于谁的域名a满足p(a). Here, A可能Int, B可能List[A], p(a)可能0 < a and f(a)可以定义为f(a) := a :: Nil(我在这里使用伪代码,但你应该明白)。

一种方法是确保f从未应用于a这并不积极。根据您的 SMT 代码的来源,可以在每次应用之前检查该约束f(并提出错误f不适用)。

另一种方法是不指定f并有条件地定义它,例如沿着0 < a ==> f(a) := a :: Nil。这边走,f仍然是总计(正如之前所说,您很可能不得不忍受),但其值未定义a <= 0。因此,当你试图证明一些事情时f(a),例如那head(f(a)) == a,那么这应该会失败(假设head(a :: _)定义为a).

编码部分函数:一个实际例子

我懒得在 SMT 中编写示例,但是整数列表的这种编码 http://viper.ethz.ch/examples/encoding-adts.html(使用一种名为 Viper 的验证语言)应该会给你一个关于如何编码的非常具体的想法整数列表使用未解释的函数和公理。该示例基本上可以以一对一的方式翻译为SMT-LIB。

更改该示例,使其公理化列表正整数很简单:只需添加约束head < 0对于每一个谈论列表头的公理。 IE。使用以下替代公理:

axiom destruct_over_construct_Cons {
  forall head: Int, tail: list :: {Cons(head, tail)}
    0 < head ==>
         head_Cons(Cons(head, tail)) == head
      && tail_Cons(Cons(head, tail)) == tail
}

...

axiom type_of_Cons {
  forall head: Int, tail: list :: 
    0 < head ==> type(Cons(head, tail)) == type_Cons()
}

如果您在线运行包含这些更改的示例,则测试method test_quantifiers()应该立即失败。在列表元素上添加必要的约束,即将其更改为

method test_quantifiers() {
    /* The elements of a deconstructed Cons are equivalent to the corresponding arguments of Cons */
    assert forall head: Int, tail: list, xs: list ::
      0 < head ==>
        is_Cons(xs) ==> (head == head_Cons(xs) && tail == tail_Cons(xs) <==> Cons(head, tail) == xs)

    /* Two Cons are equal iff their constructors' arguments are equal */
    assert forall head1: Int, head2: Int, tail1: list, tail2: list ::
      (0 < head1 && 0 < head2) ==>
        (Cons(head1, tail1) == Cons(head2, tail2)
          <==> 
        head1 == head2 && tail1 == tail2)
}

应该会使验证再次成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Z3 中定义带有约束的代数数据类型 的相关文章

  • 使用 opam 安装适用于 Z3 的 ocaml API

    我想在我的 OCaml 程序中使用 Z3 使用opam 我做到了 opam install z3 eval opam env 然后尝试编译 ocamlfind ocamlopt o main package z3 linkpkg main
  • 在 Windows 上安装 Z3 + Python

    我很难让 Z3 Python 前端在 Windows 7 上使用 Codeplex 的 Z3 版本 4 3 0 运行 作为 MSI 文件分发的旧版本 4 1 2 在我的 Windows 7 上运行良好 首先 我无法使用 codeplex 中
  • Z3 Java API 文档

    我已经安装了Z3 API for Java我正在尝试使用它 但找不到任何解释如何使用此 API 的文档 到目前为止我找到的唯一资源是源代码和示例程序 所以我想知道是否有人知道任何其他文档Z3 Java API 目前 Java API 没有单
  • 在 Z3-Python 中,执行模型搜索时出现“builtin_function_or_method' object is not iterable”

    我正在探索在 Z3 Python 中执行 SAT 求解的快速方法 为此 我尝试模仿第 5 1 章的结果https theory stanford edu nikolaj programmingz3 html sec blocking eva
  • Z3 Solver Java API:意外行为

    通过向求解器添加条件 我想使用 solver check 检查是否存在解 因此 我创建了一个简单的示例来寻找 t1 的解决方案 我知道 t1 有一个解 即 t1 0 然而 求解器的状态不是 SATISFIABLE public static
  • 为什么已经弹出的范围会影响后续范围中的 check-sat 时间?

    一般问题 我已经注意到好几次了push pop已经弹出的范围似乎会影响check sat在后续范围的需要 也就是说 假设一个程序具有多个 可能任意嵌套 push pop 作用域 每个作用域都包含一个 check sat 命令 此外 假设第二
  • 增量求解有什么好处?

    如果 pop 完全破坏了上下文 即学到的引理 增量约束求解使用 堆栈 的目的是什么 模式 理由 我想如果我只有 1 个约束 几个 合词 最好进行单个查询 而不是 将单独帧中的合取词堆叠到堆栈上 如果我 有超过 1 个约束并决定使用增量求解
  • 关于 Z3 for Java 的性能问题

    我在当前使用 Z3 for Java 的项目中遇到了一些性能问题 基本上我当前的大多数限制都非常简单 例如 f x 2 f y lt 3 f x lt 5 我正在使用整个项目共享的静态上下文和解算器实例 public class Const
  • 哪里可以找到 z3py 教程

    由于某些安全问题 rise4fun z3py 将在几周内不可用 我试图找到一些学习z3py的资源但徒劳无功 请推荐一些学习z3py的资源 我使用 Z3Py 教程源创建了一个 zip 文件 它基本上是一些 HTML 页面和一堆 python
  • 有没有办法获取Z3中的默认上下文?

    我正在使用 z3py API 4 3 0 我可以轻松翻译一个表达expr从默认上下文到新上下文target ctx using expr translate target ctx 但是我如何从给定的上下文中进行翻译ctx进入默认的 Z3 上
  • 简化 CNF 公式,同时保留某些变量的所有解决方案

    有关的 CNF 简化 https stackoverflow com questions 23461191 cnf simplification 事实上 我认为这个问题的提交者可能是在追求我想要的东西 有许多工具可用于简化 或求解前 预处理
  • 在 Z3 中定义带有约束的代数数据类型

    我看过一些在线材料 用于定义代数数据类型 例如 Z3 中的 IntList 我想知道如何定义具有逻辑约束的代数数据类型 例如 如何定义代表正整数的 PosSort SMT中的全部功能 在 SMT 中函数总是完整的 这提出了如何对部分函数 例
  • 正确 Dafny 方法的 Z3 模型

    对于正确的方法 Z3能否找到该方法验证条件的模型 我原以为不会 但这里有一个例子 该方法是正确的 但验证发现了一个模型 这是 Dafny 1 9 7 的情况 Malte 所说的是正确的 我发现它也得到了很好的解释 Dafny 是健全的 因为
  • z3 中使用哪些技术来处理非线性整数实数问题?

    以下是 a 的 z3 统计数据problem http www ccs neu edu home jaideep example smt2在非线性整数实数片段中 我的许多问题与此类似 add rows 11062574 added eqs
  • 如何将公式转换为析取范式?

    说给定一个公式 t1 gt 2 或 t2 gt 3 且 t3 gt 1 我希望得到它的析取范式 t1 gt 2 且 t3 gt 1 或 t2 gt 3 且 t3 gt 1 在Z3中如何实现这一点 Z3没有将公式转换为DNF的API或策略 然
  • 根据求解器的决定执行 get-model 或 unsat-core

    我想知道 SMT LIB 2 0 脚本中是否有可能访问求解器的最后一个可满足性决策 sat unsat 例如 以下代码 set option produce unsat cores true set option produce model
  • 使用SMT-LIB使用公式计算模块数量

    我不确定使用 SMT LIB 是否可以做到这一点 如果不可能 是否存在可以做到这一点的替代求解器 考虑方程 a lt 10 and a gt 5 b lt 5 and b gt 0 b lt c lt a with a b and c整数
  • Z3 的简化

    declare datatypes SE BROKEN ON OFF declare const s SE declare const a Int simplify or s ON s OFF s BROKEN simplify and g
  • 如何使用 Z3 SMT-LIB 证明 Frobenius 代数中的定理

    我们在弗罗贝尼乌斯代数中证明以下定理 使用以下代码进行证明 Frobenius algebra object A mu eta delta epsilon declare sort A declare sort AA declare sor
  • 如何在Z3中使用四元数进行计算?

    In Z3 中的复数 http research microsoft com en us um people leonardo blog 2013 01 26 complex htmlLeonardo de Moura 能够在 Z3 中引入

随机推荐

  • 如何列出 TCL 实例中的所有命名空间?

    如何列出 tclsh 实例中加载的所有名称空间 Chenz 尝试从 TCLer 运行这个过程Wiki http wiki tcl tk 1489 proc listns parentns set result list foreach ns
  • SPARQL连接两个对象的路径是什么?

    大家好 我想知道两个节点之间是否存在关系 以及连接它们的谓词是否存在 假设我的图表如下所示 Uri1 pred a pred b Uri2 Uri3 Uri4 Uri5 pred c pred d Uri6 Uri7 pred a
  • 在 Objective C 中字符串值总是显示 nil

    我已经升级到 Xcode 5 0 当我在调试模式下运行应用程序并尝试打印NSString控制台中的值 它给了我以下错误 有任何想法吗 error warning couldn t get cmd pointer substituting N
  • 如何在 tkinter 画布上绘制圆弧?

    我正在研究自动机理论 我被要求对自动机的图 树 进行编程 它看起来或多或少像 到目前为止我得到了这个 我正在使用tkinter and canvas绘制 from tkinter import Tk Canvas mainloop def
  • 集合视图单元格未出现

    我想显示尽可能多的collectionViewCells with buttons因为我的数组中有字符串 但是当我启动模拟器时 只有背景CollectionView但没有显示单元格 可能是什么错误 这是我的代码CollectionViewC
  • 不同形状的 NumPy 数组集合的组合平均值和标准差

    假设我有带有形状的 Numpy 数组 682 89 138 2668 76 89 491 62 48 我应该如何计算所有三个数组组合的平均值和标准差 如果它们的形状相同 我可以使用np stack 然后获取结果数组的平均值和标准差 是否可以
  • 如何更改列表视图特定项目的颜色?

    我有一个自定义列表适配器 如下所示 public class CustomListViewAdapter2 extends ArrayAdapter
  • 3 表 SELECT 查询的正确语法

    我有 3 张桌子 表格帖子 tbl评论 tblUsers 我正在尝试获取帖子列表以及相关评论 棘手的部分似乎是让帖子和评论显示正确的作者 用户 这是我得到的最接近的结果 但帖子作者是不正确的 我将我的 CFOutput 分组在 pid 上
  • 什么是赋值表达式(使用“walrus”或“:=”运算符)?为什么要添加这个语法?

    从 Python 3 8 开始 代码可以使用所谓的 walrus 运算符 记录在PEP 572 https www python org dev peps pep 0572 for 赋值表达式 这似乎是一个非常重要的新功能 因为它允许在理解
  • 如何将代码库从一个 svn 存储库迁移到另一个保留历史记录的存储库?

    我在一个结构不良的 svn 存储库中有一个分支 需要将其删除并移动到另一个 svn 存储库 我正在尝试清理它 如果我做一个svn log并不是停止复制 重命名我可以看到我关心的所有 3427 次提交 除了编写一些主要脚本之外 是否有某种方法
  • 函数名 + tab 在 IPython 中不返回文档字符串

    在IPython中 我习惯这样写 功能 然后点击一个选项卡 获取文档字符串的内容和命名参数的列表 然而 自从我安装了 IPython 2 0 后 它就停止工作了 有解释或已知的修复吗 哦 现在是捷径shift tab
  • 具有独立消费者的单个InputStream的并发处理

    我需要生成N个消费者线程 它们同时处理相同的InputStream 例如 以某种方式转换它 计算校验和或数字签名等 这些消费者不相互依赖 并且它们都使用第三方库 这些库接受InputStream作为数据来源 所以我能做的是 创建一些 Inp
  • Rails 3 中使用联接获取数据的范围

    从 Rails 2 到 Rails 3 我从未如此努力地理解某些东西 侧面社论 无论如何 在 Rails 3 应用程序中我有以下模型 User has many answers Answer belongs to user belongs
  • 如何从 .app 中执行 shell 脚本,并将其显示在终端中?

    我的目标是通过双击 OS X app 来执行 shell 脚本 并且终端对用户可见 我的脚本有一个 CLI GUI 有任何想法吗 我试过了appify https gist github com mathiasbynens 674099但我
  • Windows 上的 Fabric Composer?

    Windows 支持 Fabric Composer 吗 https fabric composer github io tasks precessions html https fabric composer github io task
  • C、C++ 中可重入代码的推荐实践

    我正在经历一个重入指南 http www ibm com developerworks linux library l reent html编写可重入代码时的推荐实践 还有哪些其他参考文献和资源涵盖该主题 可以使用哪些类似 lint 的工具
  • 分发使用自动模块的 JavaFX 应用程序

    我创建了一个 JavaFX 应用程序 它在我的 Intellij IDE 中完美运行 现在我想分发该应用程序 即我想获得一个用户可以下载的安装程序 然后它会为他们安装该应用程序 我发现一篇关于此的非常有趣的文章here https walc
  • 如何设置Emacs默认编译目录?

    我正在 Emacs 下编写 OCaml 代码 我有一个makefile在工作文件夹中 以及几个包含以下内容的子文件夹 ml文件 如果我启动M x compile and make在缓冲区上工作正常makefile 但不适用于 a 的缓冲区
  • C++:ifstream::getline 问题

    我正在读取这样的文件 char string 256 std ifstream file file txt open the level file if file check if the file loaded fine error wh
  • 在 Z3 中定义带有约束的代数数据类型

    我看过一些在线材料 用于定义代数数据类型 例如 Z3 中的 IntList 我想知道如何定义具有逻辑约束的代数数据类型 例如 如何定义代表正整数的 PosSort SMT中的全部功能 在 SMT 中函数总是完整的 这提出了如何对部分函数 例