Как я могу ограничить домен вида в Z3 одним значением? - PullRequest
1 голос
/ 03 августа 2011

Я использую следующее правило в моей программе Z3 , чтобы сделать s единственно возможным значением сортировки S.

(assert (forall ((t S)) (= t s)))

Однако приведенная выше формула дает Z3 сообщает о следующей ошибке:

Z3: ERROR: WARNING: failed to find a pattern for quantifier (quantifier id: k!8)

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

1 Ответ

2 голосов
/ 04 августа 2011

Сообщение

Z3: ОШИБКА: ПРЕДУПРЕЖДЕНИЕ: не удалось найти шаблон для квантификатора (идентификатор квантификатора: k! 8)

вводит в заблуждение.Это всего лишь предупреждение, слово «ОШИБКА» появилось случайно.Это было исправлено и будет доступно в следующем выпуске.Предупреждение просто говорит пользователю, что модуль электронного сопоставления будет игнорировать квантификатор.Тем не менее, Z3 использует много механизмов для обработки количественных формул.Модуль MBQI может обрабатывать эту количественную формулу и создавать удовлетворительные назначения для таких задач, как:

(объявление-сортировка S)

(объявление-весело s () S)

(assert (forall ((t S)) (= ts)))

(Declare-Fun a () S)

(Declare-Fun B () S)

(assert (= ab))

(check-sat)

(модель)

При этом приведенная выше количественная формулане лучший способ указать сортировку с одним элементом.Вы можете использовать типы данных для кодирования типов перечисления.Например, следующая команда определяет сорт S с элементами e1… en.(declare-datatypes ((S e1 e2 … en))) Сортировка только с одним элементом может быть указана с помощью: (declare-datatypes ((S e))) Следующий пример неудовлетворителен:

(Declare-datatypes ((S elem))))

(объявить-const a S)

(объявить-const b S)

(подтвердить (не (= ab)))

(check-sat)

...