По умолчанию глобальные переменные рассматриваются как экзистенциально квантифицированные. Например.
(declare-const x Int)
(assert (exists ((y Int)) (and (= x y) (= x y))))
(check-sat)
(get-model)
Дает
sat
(model
(define-fun y!0 () Int
0)
(define-fun x () Int
0)
)
Как заставить его рассматривать x
как forall x
, как в этом запросе:
(assert (forall ((x Int)) (exists ((y Int)) (and (= x y) (= x y)))))
(check-sat)
(get-model)
Чтобы получить значение y
, зависит от x
:
sat
(model
(define-fun y!0 ((x!1 Int)) Int
x!1)
)
Это должно быть просто вопросом синтаксиса. Возможно ли это в z3? В другом решателе SMT?
Редактировать:
Чего я хочу добиться, так это выполнить скрипт, например:
(declare-forall-const x Int)
(declare-const y Int)
(assert (and (= x y) (= x y)))
(check-sat)
(get-model)
И получить ответ вида:
sat
(model
(define-fun y!0 ((x!1 Int)) Int
x!1)
)
Другими словами, я хочу объявить параметр forall глобально и ссылаться на него в последующих утверждениях.
x
как универсальное, вы добавляете квантификаторforall
, как вы и предлагаете. Итак, я не уверен, в чем проблема. - person Christoph Wintersteiger   schedule 13.02.2016x1
,x2
, ..., шаг за шагом, а не в однойassert
. Итак, я хочу построить запрос, постепенно вводя условия и переменные (как экзистенциальные, так и универсальные) в контекст один за другим. - person Necto   schedule 13.02.2016push
/pop
и запустить один экземпляр решателя для нескольких похожих запросов (как обычно делают symbex) - person Necto   schedule 14.02.2016forall x
. - person Necto   schedule 14.02.2016declare-forall-const
forall
, точно так же, какdeclare-const
является глобальной декларациейexists
. - person Necto   schedule 15.02.2016