函数在构造函数中接收带有2个参数的排序

时间:2014-06-10 20:29:51

标签: z3 theorem-proving

我创建了4个排序(任务,角色,用户和运行),最后一个接收2个参数,然后我为每个参数声明一个好玩,包括一个用于Run,调用P接收2个参数来创建“实例” “跑。然后我创建了两个包含用户角色“关系”(Privs)的数组,另一个包含Role-Task“Relation”(角色)。我使用这两个数组断言,如果在查看用户u时,它在Privs中具有角色r,并且如果在角色中查找角色r,则它具有任务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(用户,角色对),并且在函数内部声明相同但对于P及其所有角色的所有用户。这可以通过将一个Run排序变量传递给函数来实现吗??用于访问其内部的元素(User,Role)?

1 个答案:

答案 0 :(得分:0)

您对参数类型的使用似乎有些过分:您只能使用" Run"将各种实例化为" User"和"角色"。所以你为什么要做" Run"参数。 参数排序和用例的定义在http://smtlib.org详细描述,Z3实现了这种通用格式,因此Z3对您的问题没有任何特殊之处。