Опция "pull-nested-quantifiers", кажется, вызывает проблемы в контексте для UFBV? - PullRequest
4 голосов
/ 18 ноября 2011

В настоящее время я экспериментирую с Z3 в качестве ограниченного движка для спецификаций, написанных на Alloy (реляционная логика / язык).Я использую UFBV в качестве целевого языка.

Я обнаружил проблему, используя опцию Z3 (set-option :pull-nested-quantifiers true).

Для двух семантически идентичных спецификаций SMT Spec1 и Spec2 Z3 истекает (200 секунд) для проверки Spec1, но подтверждает Spec2.

Единственное отличие между Spec1 и Spec2 состоит в том, что они имеют разные идентификаторы функций(потому что я использую имена хэша Java).Может ли это быть связано с ошибкой?

Вторым наблюдением, которым я хотел бы поделиться и обсудить, является оператор "iff" в контексте UFBV.Этот оператор не поддерживается, если установлено (set-logic UFBV).Мое решение состояло в том, чтобы использовать вместо этого «=», но это не очень хорошо работает, если операнды содержат глубоко вложенные квантификаторы и установлен «pull-nested-quantifiers».Другим экономичным решением является использование двойной импликации.

Теперь вопрос: есть ли какое-либо другое лучшее решение для модели "iff" в UFBV, потому что я думаю, что использование двойной импликации в целом потеряет, может быть, пригодно для использования?семантическая информация для улучшения / упрощения.

http://i12www.ira.uka.de/~elghazi/tmp/

вы можете найти: spec1 и spec2 буксирный (я думаю) семантически идентичный SMTспецификации и spec3 спецификации SMT, использующей "=" для моделирования "iff", для которой значение z3 превышено.

1 Ответ

4 голосов
/ 18 ноября 2011

Стратегия по умолчанию для логики UFBV не эффективна для ваших проблем. На самом деле, стратегия по умолчанию решает все из них менее чем за 1 сек. Чтобы заставить Z3 использовать стратегию по умолчанию, вам просто нужно прокомментировать следующие строки в вашем скрипте.

; (set-logic UFBV)
; (set-option :pull-nested-quantifiers true)
; (set-option :macro-finder true)

Если предупреждающие сообщения вас беспокоят, вы можете добавить:

(set-option :print-warning false)

При этом я постараюсь решить поднятые вами вопросы. Влияет ли имя идентификатора на поведение Z3? Да, они делают. Начиная с версии 3.0, мы начали использовать полный порядок выражений Z3 для выполнения таких операций, как: сортировка аргументов ассоциативно-коммутативных операторов. Этот общий порядок основан на именах идентификаторов. По иронии судьбы, эта модификация была мотивирована отзывами пользователей. В предыдущих версиях мы использовали внутренний идентификатор для выполнения таких операций, как сортировка и разрыв связей во многих различных эвристиках. Однако эти идентификаторы основаны на порядке, в котором Z3 создает / удаляет выражения, который основан на порядке, в котором пользователи объявляют символы. Таким образом, на поведение Z3 2.x будут влиять тривиальные модификации, такие как удаление неиспользуемых объявлений.

Что касается iff, он не является частью стандарта SMT-LIB 2.0. В SMT-LIB 2.0 = используется для формул и терминов. Чтобы убедиться, что Z3 полностью совместим со стандартом SMT-LIB 2.0, всякий раз, когда пользователи задают логику, поддерживаемую SMT-LIB (или скоро будет поддерживаться, например, UFBV), Z3 только «загружает» символы, определенные в нем. Когда логика не указана, Z3 предполагает, что пользователь использует «логику Z3», которая содержит все поддерживаемые теории в Z3 и многие дополнительные aliases, такие как: iff для логического значения =, if для ite и др.

...