Nano Hash - криптовалюты, майнинг, программирование

Как получить доступ к AST для ограничений во входном файле sygus в инструменте CVC4

Я хочу изменить внутреннее представление ограничений из файла sygus, сгенерированного CVC4.

Например, (ограничение (и (‹= x (f x y)) (‹= y (f x y)))) — это ограничение из small.sl, которое я передаю в cvc4 в качестве входных данных для синтеза программы.

Я знаю, что 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;

кто-нибудь знает, как получить объект для дерева выражений?

заранее спасибо

14.09.2020

Ответы:


1

Чтобы получить выражение e, связанное с командой (ограничение e), используйте SygusConstraintCommand::getExpr(). https://github.com/CVC4/CVC4/blob/b02977f0076ade00b631e8ee79a31b96bf7a24c4/src/smt/command.h#L842

Вы можете получить команды от Parser::nextCommand().

Есть несколько предостережений, чтобы использовать это. Примеры: синтаксический анализ не свободен от побочных эффектов (единственная документация о побочных эффектах — это чтение исходного кода), команды в SMT могут соответствовать нескольким командам CVC4, и вам необходимо иметь возможность генерировать новые команды и воспроизводить их, как src/main/ двоичные файлы CVC4. делать. Кроме того, печать действительной SMT-LIB из Exprs, если вы хотите отладить это, сложнее, чем кажется. Я не уверен, чего вы пытаетесь достичь, но я думаю, что вам следует обратиться за помощью напрямую к [активным] людям CVC4: https://cvc4.github.io/people.html

15.09.2020
  • Спасибо, Тим, это было полезно. Теперь я могу получить доступ к дереву выражений. Я хотел понять, как именно CVC4 создает дерево выражений для файлов sygus в качестве входных данных. 17.09.2020

  • 2

    Это звучит как опасная и ненужная вещь: зачем вам напрямую возиться со сгенерированным ограничением? Это действительно должно быть учтено в инструменте, который генерирует эти ограничения.

    Даже если у вас есть доступ к внутренностям, испорченное внутреннее представление CVC4 может означать нарушение множества внутренних инвариантов, и состояние решателя, скорее всего, станет недействительным.

    Если у вас нет доступа к генерирующей системе, я бы рекомендовал выгрузить SMTLib в файл, прочитать его как текст, изменить его по своему усмотрению, а затем вызвать для него cvc4. Это был бы единственный способ гарантировать, что вы сохраните внутренние инварианты CVC4 нетронутыми.

    14.09.2020
  • Спасибо за ваш ответ. Да, изменить сам файл, а затем передать его в качестве входных данных — это прямой способ выполнить мою работу. Но представьте, если у меня есть тысячи таких модификаций, и я отдам их решателю. Это потребует больших человеческих усилий. Извините, я не упомянул об этом в своем вопросе, но я не хочу менять код cvc4, но намерен создать посетителя для выражений, сформированных из этих ограничений. Для этого мне нужен объект, указывающий на корневой узел выражения. 15.09.2020
  • Я думаю, что затраты неизбежны. Изменение внутреннего AST будет чрезвычайно хрупким: если разработчики CVC4 что-то изменят внутри, ваша конструкция может сделать вещи недействительными. Я думаю, что корень проблемы следует решить, внимательно изучив, откуда берутся эти ограничения, и почему они не в той форме, которую вы хотите? К тому времени, когда дело дойдет до SMTLib2/CVC4, будет уже слишком поздно. 15.09.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..