如何访问 CVC4 工具中输入 sygus 文件中约束的 AST

How to access the AST for constraints in the input sygus file in CVC4 tool

我想从 CVC4 生成的 sygus 文件中改变约束的内部表示。

例如(constraint (and (<= x (f x y)) (<= y (f x y)))) 是来自 small.sl 的约束,我将其提供给 cvc4 qas 输入以合成程序。

我知道 cvc4 使用 class Expr;

创建了一个内部表示

cvc4 定义了一个命令 cmd,它似乎指向 sygus 文件中的每个语句,如下所示:

(set-logic LIA)

(synth-fun f ((x Int) (y Int)) Int)

(declare-var x Int)
(declare-var y Int)
(constraint (= (f x y) (f y x)))
(constraint (and (<= x (f x y)) (<= y (f x y))))

(check-synth)

我关心的是这两个约束。我想通过围绕运算符交换约束来修改约束,如下所示:

(constraint (and (<= x (f x y)) (<= y (f x y)))) commutated to

(constraint (and (<= y (f x y)) (<= x (f x y))))

为此,我正在搜索指向约束解析后形成的表达式树的对象。

这就是他们声明解析器构建器的方式。

ParserBuilder parserBuilder(pExecutor->getSolver(), filename, opts);

此处定义了指向解析器的指针。

std::unique_ptr<Parser> parser(parserBuilder.build());

这是指向输入文件中已解析语句的命令。

std::unique_ptr<Command> cmd;

这是内部表示的 class 声明。

// The internal expression representation
template <bool ref_count>
class NodeTemplate;

class NodeManager;

class Expr;
class ExprManager;
class SmtEngine;
class Type;
class TypeCheckingException;
class TypeCheckingExceptionPrivate;

有谁知道如何获取表达式树的对象?

提前致谢

这听起来像是一件危险且不必要的事情:您为什么要直接破坏生成的约束?这确实应该在生成这些约束的工具中解决。

即使您可以访问内部结构,弄乱内部 CVC4 表示也可能意味着您违反了一堆内部不变量,求解器状态很可能会变得无效。

如果您无法访问生成系统,我建议将 SMTLib 转储到文件中,将其作为文本读取,根据需要进行更改,然后对其调用 cvc4。这将是确保您保持 CVC4 内部不变性不变的唯一方法。

要获取与(约束 e)命令关联的表达式 e,请使用 SygusConstraintCommand::getExpr()https://github.com/CVC4/CVC4/blob/b02977f0076ade00b631e8ee79a31b96bf7a24c4/src/smt/command.h#L842

您可以从 Parser::nextCommand() 获取命令。

使用它有几个注意事项。示例:解析不是无副作用的(副作用的唯一文档是阅读源代码),SMT 中的命令可以对应多个 CVC4 命令,并且您需要能够生成新命令并像 CVC4 一样重播它们 src/main/ 二进制文件可以。如果你想调试这比听起来更难,还要从 Exprs 打印有效的 SMT-LIB 。我不确定您要完成什么,但我认为您应该直接联系 [活跃的] CVC4 人员寻求帮助:https://cvc4.github.io/people.html