繁体   English   中英

在Z3定理证明者中设置

[英]sets in Z3 theorem prover

我有一份合金声明

sig Card{}
sig ATM {card :  disj  set Card}

然后像这样将其转换为Z3:

1- (declare-sort ATM) 
2- (declare-fun isATM (ATM) Bool)
3- (declare-sort Card)
4- (declare-fun isCard (Card) Bool)
5- (declare-fun card (ATM Card) Bool)
6- (assert(forall ((c Card) (atm ATM)) (=> (card atm c) (and(isATM atm) (isCard c))))) 
7- (declare-fun disjSetCard (ATM) Card)
8- (assert(forall ((atm ATM) (c Card))  (=> (card atm c)(= c(disjSetCard atm)))))
check sat

问题是,在第7行中,如何使函数disjSetCard返回(disj set)卡而不是一张Card。 请问我的代码正确还是有其他解决方案?

您可以使用返回集合的函数对关系进行编码:

(define-sort Set (T) (Array T Bool))    
(declare-sort ATM)     
(declare-sort Card)    
(declare-fun ATMtoCard (ATM) (Set Card))

并使用以下方法约束ATM的不同成员的字段值不相交:

(forall ((a Card) (x ATM) (y ATM))
(=>
  (and (select (ATMtoCard x) a) (select (ATMtoCard y) a))
  (= x y)
))

对应于Alloy表达式:

all a: Card | all x, y: ATM |
a in x.card && a in y.card implies x = y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM