gpt4 book ai didi

c++ - 如何使用 z3 中的 arg() 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:48 25 4
gpt4 key购买 nike

我最近开始使用带有 C++ 绑定(bind)的 z3 API。我的任务是获得表达式中的单个元素

示例:(x || !z) && (y || !z) && (!x || !y || z)

如何使用函数 arg(i) 索引每个位置来获取单个变量?

在给定示例的情况下,arg(1) 应返回变量“X”。z3 中是否还有其他函数可以提供我想要的输出?

这是我试过的代码,但输出不是单个变量:

#include<iostream> 
#include<string>
#include "z3++.h"
using namespace z3;

int main()
{
context c;
expr x = c.bool_const("x");
expr y = c.bool_const("y");
expr z = c.bool_const("z");
expr prove = (x || !z) && (y || !z) && (!x || !y || z);
solver s(c);
expr argument = prove.arg(1);
std::cout<<argument;
}

输出:

(or (not x) (not y) z)(base)

我基本上需要制作一个自动化系统来索引表达式中的每个位置,并检查它是运算符还是操作数,然后插入到数据结构中。所以我想我会创建一个循环并索引表达式中的每个位置。但是 arg(i) 没有给我我想要的输出。

最佳答案

您必须遍历 AST 并挑选出节点。 Z3 AST 可能相当棘手,因此在不知道您的目标是什么的情况下,很难判断这是否是最佳方法。但是,假设您真的想遍历 AST,这就是您的处理方式:

#include<iostream>
#include<string>
#include "z3++.h"
using namespace z3;
using namespace std;

void walk(int tab, expr e)
{
string blanks(tab, ' ');

if(e.is_const())
{
cout << blanks << "ARGUMENT: " << e << endl;
}
else
{
cout << blanks << "APP: " << e.decl().name() << endl;
for(int i = 0; i < e.num_args(); i++)
{
walk(tab + 5, e.arg(i));
}
}
}

int main()
{
context c;
expr x = c.bool_const("x");
expr y = c.bool_const("y");
expr z = c.bool_const("z");
expr e = (x || !z) && (y || !z) && (!x || !y || z);

walk(0, e);
}

运行时,该程序打印:

APP: and
APP: and
APP: or
ARGUMENT: x
APP: not
ARGUMENT: z
APP: or
ARGUMENT: y
APP: not
ARGUMENT: z
APP: or
APP: or
APP: not
ARGUMENT: x
APP: not
ARGUMENT: y
ARGUMENT: z

因此,您可以准确地看到应用程序 (APP) 和参数 (ARGUMENT) 的位置。您可以从这里获取它并构建您正在谈论的数据结构。

但是,请注意 z3 AST 可以有许多不同类型的对象:量词、数字、位 vector 、 float 。因此,如果您想让它适用于任意 z3 表达式,那么在开始编码之前详细研究实际的 AST 是了解所有复杂性的好主意。

关于c++ - 如何使用 z3 中的 arg() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56455502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com