使用 C++ API 进行数组选择和存储

2023-12-24

我正在使用 z3 v 4.1。我正在使用 C++ API,并尝试在上下文中添加一些数组约束。

我在 C++ API 中没有看到选择和排序函数。我尝试混合使用 C 和 C++ API。在示例中array_example1()如果我将上下文变量从Z3_Context(即 C API)到context(即 C++ API)我在“创建先行词”语句中遇到分段错误

void array_example1(){

context ctx; //Z3_context ctx; 
Z3_sort int_sort, array_sort;
Z3_ast a1, a2, i1, v1, i2, v2, i3;
Z3_ast st1, st2, sel1, sel2;
Z3_ast antecedent, consequent;
Z3_ast ds[3];
Z3_ast thm;

printf("\narray_example1\n");
LOG_MSG("array_example1");

//ctx = mk_context();

int_sort    = Z3_mk_int_sort(ctx);
array_sort  = Z3_mk_array_sort(ctx, int_sort, int_sort);

a1          = mk_var(ctx, "a1", array_sort);
a2          = mk_var(ctx, "a2", array_sort);
i1          = mk_var(ctx, "i1", int_sort);
i2          = mk_var(ctx, "i2", int_sort);
i3          = mk_var(ctx, "i3", int_sort);
v1          = mk_var(ctx, "v1", int_sort);
v2          = mk_var(ctx, "v2", int_sort);

st1         = Z3_mk_store(ctx, a1, i1, v1);
st2         = Z3_mk_store(ctx, a2, i2, v2);

sel1        = Z3_mk_select(ctx, a1, i3);
sel2        = Z3_mk_select(ctx, a2, i3);

/* create antecedent */
antecedent  = Z3_mk_eq(ctx, st1, st2);

/* create consequent: i1 = i3 or  i2 = i3 or select(a1, i3) = select(a2, i3) */
ds[0]       = Z3_mk_eq(ctx, i1, i3);
ds[1]       = Z3_mk_eq(ctx, i2, i3);
ds[2]       = Z3_mk_eq(ctx, sel1, sel2);
consequent  = Z3_mk_or(ctx, 3, ds);

/* prove store(a1, i1, v1) = store(a2, i2, v2) implies (i1 = i3 or i2 = i3 or select(a1, i3) = select(a2, i3)) */
thm         = Z3_mk_implies(ctx, antecedent, consequent);
printf("prove: store(a1, i1, v1) = store(a2, i2, v2) implies (i1 = i3 or i2 = i3 or select(a1, i3) = select(a2, i3))\n");
printf("%s\n", Z3_ast_to_string(ctx, thm));
prove(ctx, thm, Z3_TRUE);

}

我也尝试过转换st1 and st2 from Z3_AST to expr然后将它们等同,但我仍然遇到分段错误。如何使用 C++ API 进行选择和存储?


Z3有两种内存管理模式:push/pop和引用计数。引用计数是很晚才引入的。用于创建的 C API 方法Z3_Context定义将使用哪种内存管理模式。应用程序编程接口Z3_mk_context创建一个上下文,其中push/pop使用策略。也就是说,AST 对象在以下情况下被删除:Z3_pop被调用。匹配之间创建的任何 AST 对象Z3_push将被删除。此策略使用起来很简单,但它可能会阻止您的应用程序释放未使用的内存。应用程序编程接口Z3_mk_context_rc创建一个上下文,其中引用计数用于回收内存。这是 Z3 4.x 中的官方方法。此外,Z3 4.x 中引入的新对象(例如,战术、求解器、目标)仅支持这种方法。 如果您使用 C++、C#、OCaml 或 Python API。然后,使用新的引用计数策略就非常简单了。另一方面,C API 更难使用,因为我们必须显式调用Z3_*inc_ref and Z3_*dec_ref蜜蜂。如果我们错过其中之一,我们可能会发生崩溃(如您的示例)或内存泄漏。 在C++ API中,我们提供了几个“智能指针”来自动为我们管理引用计数器。

你的例子崩溃了,因为你替换了Z3_context ctx with context ctx。类的构造函数context uses Z3_mk_context_rc代替Z3_context。文件example.cppc++ 目录中演示了如何结合 C++ 和 C API(请参阅函数capi_example())。在此示例中,C++ 智能指针用于包装 C API 返回的 C 对象。

最后,C++ API 提供了以下用于创建数组表达式的函数:

inline expr select(expr const & a, expr const & i) {
    check_context(a, i);
    Z3_ast r = Z3_mk_select(a.ctx(), a, i);
    a.check_error();
    return expr(a.ctx(), r);
}
inline expr select(expr const & a, int i) { return select(a, a.ctx().num_val(i, a.get_sort().array_domain())); }
inline expr store(expr const & a, expr const & i, expr const & v) {
    check_context(a, i); check_context(a, v);
    Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
    a.check_error();
    return expr(a.ctx(), r);
}
inline expr store(expr const & a, int i, expr const & v) { return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), v); }
inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
inline expr store(expr const & a, int i, int v) { 
    return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range())); 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C++ API 进行数组选择和存储 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • URL 主机中可以显示哪些有效字符?

    我正在编写一些处理 URL 的代码 并且我想确保我不会遗漏一些奇怪的情况 除 A Z 0 9 和 之外 主机是否还有其他有效字符 这包括子域中的任何内容等 本质上是 和第一个 之间的任何内容 Thanks 请参见对有效主机名的限制 http
  • 将 AngularFire 与 Angular ui-router 一起使用时如何启用路由安全?

    是否可以使用AngularFire 路线安全模块 https github com firebase angularFire seed blob master app js module routeSecurity js有角的UI路由器 h
  • 如果我在应用程序中添加 ACTION-VIEW 最终结果是什么?

    我从我的 Android 工作室收到了这个通知 应用程序无法被 Google 搜索索引 考虑添加至少一个 具有 ACTION VIEW 意图填充器的活动 请参阅问题说明 更多细节 添加深层链接以使您的应用程序进入 Google 索引并获得安
  • 如何跟踪 Django 中的按钮单击?

    Views py 我希望能够转到用户页面 然后单击并通过与 Twitter 完全相同的按钮关注他们 我有点知道如何添加用户 正如您在我的视图中通过添加变量看到的那样 但我真的不知道如何将其实际实现到一个按钮中 让我可以跟随用户 我已经被困在
  • “%tB”格式化程序如何工作?

    System out format tB 12 我应该从中得到一个 十二月 但是我得到了一个很好的例外 Exception in thread main java util IllegalFormatConversionException
  • 如何使 Firebase 函数模拟器基于数据库模拟器更新触发

    简而言之 我想测试一个Firebase 功能 https firebase google com docs functions本地 特别是由实时数据库触发器 https firebase google com docs functions
  • 前端实例时间突然增加[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经使用 GAE 应用程序 1 年了 每天前端实例时间花费不到 1 美元 然而 今天它突然增加到10美元 我没有做任何事情 应用程序的流
  • 如何让div在浏览器中占据100%视口高度

    我有一个 div 标签 我意识到它没有按应有的方式填充 100 的高度 My code container width 100vw height 100vh background purple body margin 0px div div
  • 阻止 AWS ElasticBeanstalk 中 Apache 中的无效 HTTP_HOST 标头

    我有几个运行部署在 AWS ElasticBeanstalk 中的 Django Apache 的网站 我唯一的问题是每天收到数百封有关此主题的电子邮件 Django ERROR EXTERNAL IP Invalid HTTP HOST
  • 使用 Emscripten 编译 GMP/MPFR

    好吧 这已经让我发疯了 我已经尝试了至少一个月 但互联网上的任何地方都没有帮助 我按照以下步骤操作this https github com kripken gmp js 当我执行这些步骤时 甚至这个示例也不起作用 因为当我这样做时 我得到
  • tableGrob:设置grid.table的高度和宽度

    我正在尝试创建一个函数 为我提供一个可以用于 indesign illustrator 或 inkscape 的绘图 在尝试这样做时 我有两个无法解决的问题 1 设置我的绘图 或只是grobTable 的宽度和高度 我得到的输出非常小 当在
  • 如何从从节点向主节点发送动态数组

    我正在完成一个简单的 MPI 程序 但我正在努力完成该项目的最后一部分 我发2个ints 包含从节点的起点和终点 使用这些我需要创建一个数组并填充它 我需要将其发送回主节点 从机代码如下 printf Client waiting for
  • .NET 中两个字符串的逐字差异比较

    我需要对两个字符串进行逐字比较 类似 diff 的东西 但用于单词 而不是行 就像维基百科中所做的那样 结果我想返回两个单词索引数组 它们在两个字符串中不同 NET 是否有任何库 框架 standalone methods 可以做到这一点
  • Pandas 中的条件颜色格式

    条件格式中的任务 我猜使用样式 蟒蛇 熊猫 有一个板有两根柱子 应突出显示第二个表 状况 如果第一列数超过第二列数 则显示为绿色 如果第一列数等于第二列数 则为黄色 in red if the 1st columns number is l
  • 谷歌日历脚本创建事件与GuestsCanModify设置为true?

    我已经设法让一个脚本可以从谷歌电子表格中获取值并创建日历事件 我可以添加客人 但我不知道如何允许他们的客人可以修改状态 我可以设置高级参数 例如位置和客人 我如何在创建事件时对其进行设置 Thanks 您正在寻找的方法是CalendarEv
  • 项目评估后访问build.gradle中的sdk.dir值

    我的 build gradle 文件中有一个自定义任务 它在进行 dex 之前对类文件进行字节码转换 如下所示 task droidcook type JavaExec main org tsg android asm Main after
  • 自动格式化 pom.xml 而不使用 m2eclipse 插件

    我在 Eclipse 中开发时不使用 Eclipse maven 插件 我使用以下命令在外部生成 Eclipse 类路径 mvn eclipse eclipse 这已经运行良好一段时间了 我不倾向于添加 Maven 插件 但是 我希望能够
  • 在Java中,NaN是什么意思?

    我有一个程序试图缩小double下降到所需的数字 我得到的输出是NaN 什么是NaN在Java中是什么意思 取自这一页 http www ica luz ve dfinol mat javafloat html NaN 代表 不是数字 南
  • 带有外部脚本的动态添加的 javascript 不会被执行

    这就是我们的场景 我们要做的第一件事是 附加一段 javascript 代码 将外部脚本添加到文档中 如下所示 function var e document createElement script e type text javascr
  • 使用 C++ API 进行数组选择和存储

    我正在使用 z3 v 4 1 我正在使用 C API 并尝试在上下文中添加一些数组约束 我在 C API 中没有看到选择和排序函数 我尝试混合使用 C 和 C API 在示例中array example1 如果我将上下文变量从Z3 Cont