我在合金网站上读到签名定义了一个集合。鉴于这个定义,我试图理解下面的合金代码:
enum dooroptype { unlocked, locked, opened}
enum enginetype {on,off}
enum motortype { ismoving, still}
enum key_location { in_car, faralone}
abstract sig state{
inside,far, near : set Person,
car_action : motortype,
engine : enginetype,
key_position : (Person + key_location),
door : dooroptype
}
如果签名实际上定义了一个集合,那么为什么我们在签名定义中有这么多参数,因为集合是一元关系?如果我错了,怎么解释这个定义。
答案 0 :(得分:3)
我正在采取合金的第一步,但我会尽力回答。这就是你在上面的代码中所拥有的:
state -> set Person
state -> one motortype
state -> one enginetype
state -> Person
和state -> key_location
的并集(但具有多重性,将每个状态限制为最多出现一次,因此状态可以与Person
关联或key_location
,但不是两者都有)state -> dooroptype
简而言之,上面定义的所有内容都是关系,有些是一元的,有些是二元的。二元关系inside, far and near
定义为set
多重性,而所有其他关系定义为多重性。
换句话说,签名是一个集合,关系在签名内定义,但是全局可见。
答案 1 :(得分:2)
两个小的修正:
从技术上讲,enum enginetype {on,off}是
的缩写sig enginetype {}
one sig on, off extends engine type {}
所以它声明了3组,其中两组(开和关)是单例。
中字段key_position的声明
abstract sig state{
key_position : (Person + key_location)
}
确实可以被视为两个关系的联合(在状态 - >人和状态 - > key_location),但多重约束是对于任何状态s只有一个s.key_position值,而不是两个Aviad的表述所暗示的价值。