0

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

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

我知道 cvc4 使用类 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;

这是内部表示的类声明。

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

class NodeManager;

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

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

提前致谢

4

2 回答 2

0

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

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

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

于 2020-09-14T15:24:32.870 回答
0

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

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

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

于 2020-09-15T16:39:42.873 回答