理解合金中的签名

时间:2012-11-12 09:41:17

标签: alloy

我在合金网站上读到签名定义了一个集合。鉴于这个定义,我试图理解下面的合金代码:

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
}

如果签名实际上定义了一个集合,那么为什么我们在签名定义中有这么多参数,因为集合是一元关系?如果我错了,怎么解释这个定义。

2 个答案:

答案 0 :(得分:3)

我正在采取合金的第一步,但我会尽力回答。这就是你在上面的代码中所拥有的:

  1. dooroptype = set(一元​​关系),正好有3个原子。
  2. enginetype = set(一元​​关系),正好有2个原子。
  3. motortype = set(一元​​关系),正好有2个原子。
  4. key_location =设置(一元关系)恰好有2个原子。
  5. state = set(一元​​关系),包含0个或更多原子。
  6. inside,far和near =二元关系定义为state -> set Person
  7. car_action =二元关系定义为state -> one motortype
  8. engine =二元关系定义为state -> one enginetype
  9. key_position =两个二元关系state -> Personstate -> key_location的并集(但具有多重性,将每个状态限制为最多出现一次,因此状态可以与Person关联或key_location,但不是两者都有)
  10. door =二元关系定义为state -> dooroptype
  11. 简而言之,上面定义的所有内容都是关系,有些是一元的,有些是二元的。二元关系inside, far and near定义为set多重性,而所有其他关系定义为多重性。

    换句话说,签名是一个集合,关系在签名内定义,但是全局可见。

答案 1 :(得分:2)

两个小的修正:

  1. 从技术上讲,enum enginetype {on,off}是

    的缩写
    sig enginetype {}
    one sig on, off extends engine type {}
    
  2. 所以它声明了3组,其中两组(开和关)是单例。

    1. 中字段key_position的声明
      abstract sig state{
        key_position : (Person + key_location)
        }
      
    2. 确实可以被视为两个关系的联合(在状态 - >人和状态 - > key_location),但多重约束是对于任何状态s只有一个s.key_position值,而不是两个Aviad的表述所暗示的价值。