Эквивалент define-fun в Z3 API

Используя Z3 с текстовым форматом, я могу использовать define-fun для определения функций для повторного использования позже. Например:

 (define-fun mydiv ((x Real) (y Real)) Real (if (not (= y 0.0)) (/ xy) 0.0)) 

Интересно, как создать define-fun с Z3 API (я использую F #) вместо того, чтобы повторять тело функции всюду. Я хочу использовать его, чтобы упростить формулы дублирования и отладки. Я пытался использовать Context.MkFuncDecl , но, похоже, он генерирует неинтерпретируемые функции.

    Команда define-fun просто создает макрос. Обратите внимание, что стандарт SMT 2.0 не позволяет рекурсивные определения. Z3 будет расширять каждое появление my-div во время parsingа. Команда define-fun может использоваться, чтобы сделать входной файл более простым и легким для чтения, но внутренне он не помогает Z3.

    В текущем API нет поддержки для создания макросов. Это не является реальным ограничением, так как мы можем определить функцию C или F #, которая создает экземпляры макроса. Однако, похоже, вы хотите отображать (и вручную проверять) формулы, созданные с использованием Z3 API. В этом случае macros вам не помогут.

    Один из вариантов – использовать кванторы. Вы можете объявить неинтерпретированную функцию my-div и утвердить формулу, обобщенную по величине:

     (declare-fun mydiv (Real Real) Real) (assert (forall ((x Real) (y Real)) (= (mydiv xy) (if (not (= y 0.0)) (/ xy) 0.0)))) 

    Теперь вы можете создать формулу, используя неинтерпретированную функцию mydiv .

    Этот вид количественной формулы может обрабатываться Z3. На самом деле существует два варианта обработки такого квантификатора:

    1. Используйте средство поиска макросов: этот шаг предварительной обработки идентифицирует кванторы, которые по существу определяют macros и расширяют их. Однако расширение происходит только во время предварительной обработки, а не во время parsingа (т. Е. Времени построения формулы). Чтобы включить MACRO_FINDER=true поиска модели, вы должны использовать MACRO_FINDER=true
    2. Другой вариант – использовать MBQI (создание экземпляра на основе модели на основе модели). Этот модуль также может обрабатывать этот квантификатор. Однако квантификаторы будут расширены по требованию.

    Конечно, решающее время может сильно зависеть от того, какой подход вы используете. Например, если ваша формула неудовлетворительна независимо от «значения» mydiv , то подход 2, вероятно, лучше.

    У меня такая же проблема. В частности, мне нужна была функция:

     Z3_ast Z3_mk_bvredxnor(Z3_context ctx, Z3_ast t) 

    который выполняет xnor по всем битам битвектора, указанным в аргументе функции, и возвращает битвектор длины 1.

    Поскольку эта функция не существует в API, я начал использовать:

     Z3_ast mk_bvredxnor(Z3_context ctx, Z3_ast t) { size_t i; size_t s = Z3_get_bv_sort_size(ctx,Z3_get_sort(ctx,t)); Z3_ast ret = Z3_mk_extract(ctx,0,0,t); for(i=1;i 

    Тогда попытка отладки моих ограничений была кошмаром.

    Поэтому я придумал:

     Z3_func_decl getBvredxnorDecl(Z3_context ctx, int size) { static bool sizes[64]={0}; static Z3_func_decl declTab[64]={0}; if(sizes[size]) return declTab[size]; Z3_sort bv_size = Z3_mk_bv_sort(ctx, size); Z3_sort bv1 = Z3_mk_bv_sort(ctx, 1); stringstream buff; buff << "bvredxnor" << size; Z3_symbol var_name = Z3_mk_string_symbol(ctx,"X"); Z3_symbol func_name = Z3_mk_string_symbol(ctx, buff.str().c_str()); Z3_func_decl bvredxnorDecl = Z3_mk_func_decl(ctx, func_name, 1, &bv_size, bv1); declTab[size]=bvredxnorDecl; Z3_ast b = Z3_mk_bound(ctx,0,bv_size); /* bounded variable */ Z3_ast bvredxnorApp = Z3_mk_app(ctx,bvredxnorDecl, 1, &b); Z3_pattern pattern = Z3_mk_pattern(ctx,1,&bvredxnorApp); Z3_ast bvredxnor_def = mk_bvredxnor(ctx,b); Z3_ast def = Z3_mk_eq(ctx,bvredxnorApp,bvredxnor_def); Z3_ast axiom = Z3_mk_forall(ctx,0,1,&pattern,1,&bv_size,&name,def); Z3_assert_cnstr(ctx,axiom); return bvredxnorDecl; } Z3_ast bvredxnor(Z3_context ctx, Z3_ast t) { int size = Z3_get_bv_sort_size(ctx,Z3_get_sort(ctx,t)); return Z3_mk_app(ctx,getBvredxnorDecl(ctx,size),1, &t); } 

    Любые комментарии для улучшения этого приветствуются. Между тем, он решает проблему, которую я здесь

    Это делает трюк, но сложность моей модели ...

    Также мне интересно:

    • Поскольку это все сделано программно, я предполагаю, что MACRO_FINDER = TRUE не будет иметь никакого влияния (поскольку это шаг обработки).
    • Поскольку MBQI включен по умолчанию, нет необходимости его активировать, правильно?
    Interesting Posts

    Карта Choropleth в ggplot с полигонами с отверстиями

    Не удалось передать артефакт org.apache.maven.plugins: maven-surefire-plugin: pom: 2.7.1 из / в центральный (http://repo1.maven.org/maven2)

    Добавление нуля до значений в столбец электронной таблицы Excel?

    Черный экран, нет биографии, советы

    Пользовательский агент Android HTTP

    Программное обеспечение для хранения часто используемого текста на ПК

    Плагин Firefox для изучения английского языка

    Каковы все допустимые символы для имен людей?

    Generics компилируется и запускается в Eclipse, но не компилируется в javac

    конкатенация строки и чисел Java

    Как удалить элемент из списка python в цикле?

    Проблемы с настройкой Dual Monitor между ноутбуком и внешним монитором

    Сгенерировать PDF из документации API Swagger

    Spring: namespace vs contextConfigИнтересные параметры размещения в web.xml

    Локализация в JSF, как запоминать выбранную локаль за сеанс вместо запроса / представления

    Давайте будем гением компьютера.