为什么在箭头表达式中使用字段时会有所不同?

时间:2017-10-25 19:15:26

标签: alloy

以下签名描述了照片管理应用程序的状态:

sig ApplicationState {
    catalogs: set Catalog,
    catalogState: catalogs -> one CatalogState
}

当然,签名会创建一个集合。在这种情况下,它会创建一组ApplicationStates:

ApplicationState0
ApplicationState1
...

目录是一个字段。它将每个ApplicationState映射到一组目录值:

ApplicationState0, Catalog0
ApplicationState0, Catalog1
ApplicationState1, Catalog0
...

catalogState也是一个字段。它将每个ApplicationState映射到关系。关系是:

catalogs -> one CatalogState

该关系表示:将目录的每个值映射到一个CatalogState值。我们已经看过目录了,我将在此重复:

ApplicationState0, Catalog0
ApplicationState0, Catalog1
ApplicationState1, Catalog0
...

因此,关系表示将每个元组映射到一个CatalogState,如下所示:

ApplicationState0, Catalog0, CatalogState0
ApplicationState0, Catalog1, CatalogState0
ApplicationState1, Catalog0, CatalogState0
...

好的,回到catalogState。之前我们说它将每个ApplicationState映射到一个关系,我们只看到了那个关系。所以,我认为catalogState表示与arity = 4的关系,如下所示:

ApplicationState0, ApplicationState0, Catalog0, CatalogState0
ApplicationState0, ApplicationState0, Catalog1, CatalogState0
ApplicationState0, ApplicationState1, Catalog0, CatalogState0
...

但是,当我运行Alloy Evaluator时,它表示catalogState是三元关系。我从这个例子中得到的结论是:

  1. 通常,字段名称表示关系。

  2. 箭头表达式中使用的字段名称不表示关系。相反,它表示关系的第2列(关系的范围)。

  3. 是吗?软件抽象书中解释了哪些内容?

1 个答案:

答案 0 :(得分:1)

软件抽象的第4.2.2节(第二版中的第97页)开始

  

关系被声明为签名字段。

我认为这至少解决了你的部分问题。 (我认为通过“字段”和关系的索引条目并阅读它们指向的每个部分可能会有所帮助。)

你说

  

箭头表达式中使用的字段名称不表示关系。相反,它表示关系的第2列(关系的范围)。

这可能听起来很迂腐,但不是:字段名称总是表示关系。但是,在签名声明的上下文中,它们隐含地以this.为前缀,这将删除关系的第一列。在您的声明catalogState: catalogs -> one CatalogState中,对catalogs的引用确实是对ApplicationState和Catalog的二元关系的引用。但是,在这种情况下,它会默默地扩展为this.catalogs,它会评估一组目录个体。关键字this软件抽象的第4.2.2节中介绍。

声明的基数约束也可能是您示例中的一个复杂因素;我不会试图在这里解释它们的影响。我只会说,当我遇到基数限制问题时,我经常发现,仔细阅读附录B中语言参考的相关部分通常足以让我了解发生了什么。 (我承认有时候读了不止一次。)