Объявить символы, которые остаются действительными за пределами их области действия

В Z3 2.x была особенность (ну, скорее, ошибка), что объявления символов не выскакивали, например. следующий код принимается Z3 2.x:

(push)
(declare-fun x () Int)
; Assumptions made in this scope will be popped correctly
(pop)
(assert (= x x))

Z3 3.x больше не принимает этот код ("неизвестная константа").

Есть ли способ восстановить старое поведение? Или, по-другому, как можно объявить символы внутри областей видимости, чтобы объявление (и только объявление, а не предположения) было глобальным, т. е. не всплывающим?


person Malte Schwerhoff    schedule 07.09.2011    source источник


Ответы (1)


Да, в Z3 2.x все объявления были глобальными. Мы изменили это поведение в Z3 3.x, потому что в стандарте SMT-LIB 2.0 указано, что все объявления должны иметь область видимости. Вы можете восстановить старое поведение с помощью опции :global-decls.

(set-option :global-decls true)
(push)
(declare-fun x () Int)
(pop)
(assert (= x x))
person Leonardo de Moura    schedule 07.09.2011
comment
Превосходно! Z3 - такой замечательный инструмент, я бы соблазнился купить футболки с его товарами, если бы они были доступны :-) Спасибо! - person Malte Schwerhoff; 08.09.2011