Функция получения сортировки с 2-мя параметрами в конструкторе

Я создал 4 вида (Task, Role, User и Run), последний получает 2 параметра, затем я объявляю забаву для каждого из них, в том числе один для Run , вызываю P, который получает 2 параметра для создания «экземпляра» Run . Затем я создал два массива, один из которых содержит «отношение» роли пользователя (Privs), а другой — «отношение» роли-задачи (роли). Я использую эти два массива, чтобы утверждать, что при поиске пользователя u у него есть роль r в Privs, и если при поиске роли r в Roles у него есть задача t. До сих пор мне удается делать это отдельными строками, например:

(declare-sort Task)
(declare-sort Role)
(declare-sort User)
(declare-sort Run 2)
(define-sort P (User Role) (Run User Role))
(declare-fun t () Task)
(declare-fun r () Role)
(declare-fun u () User)
(declare-const Privs (Array User Role))
(declare-const Roles (Array Role Task))


(assert (= (select Privs u) r))
(assert (= (select Roles r) t))

Но теперь я пытаюсь сделать забаву, которая получает пару Run (User, Role) и внутри функции утверждает то же самое, но для всех пользователей в P и всех его ролях. Можно ли это сделать, передав в функцию переменную сортировки Run??.. для доступа к ее элементам (User, Role) внутри??


person user3723800    schedule 10.06.2014    source источник


Ответы (1)


Ваше использование параметрических типов кажется излишним: вы используете «Выполнить» только с сортировками, созданными для «Пользователя» и «Роли». Так почему вы должны сделать «Выполнить» параметрическим. Определение параметрических сортировок и вариантов использования подробно описано на http://smtlib.org, Z3 реализует этот общий формат, поэтому в вашем вопросе нет ничего особенного для Z3.

person Nikolaj Bjorner    schedule 12.06.2014