订购套装意味着什么?

时间:2018-02-11 21:57:10

标签: alloy

当使用集合调用排序模块时,所有这些函数突然在集合中可用:first, last, next, prev, etc.

first returns the first atom.
last returns the last atom.
first.next returns the second atom.

但是等等!

根据定义,集合是无序的。那你怎么订一套呢?

考虑这组颜色:

abstract sig Color {}
one sig red extends Color {}
one sig yellow extends Color {}
one sig green extends Color {}

订购这组颜色意味着什么?假设我们调用了订购模块:

open util/ordering[Color]

first返回什么? last返回什么? first.next返回什么?

让合金生成一些实例:

run {}

以下是一些生成的实例:

实例#1

first returns: yellow
last returns: green
first.next returns: red

实例#2

first returns: yellow
last returns: red
first.next returns: green

实例#3

first returns: green
last returns: yellow
first.next returns: red

请注意,每个实例的排序都不同。

现在,让我们订购一个简单的签名:

open util/ordering[Time]
sig Time {}
run {}

仅生成一个实例:

实例#1

first returns: Time0
last returns: Time2
first.next returns: Time1

不再有实例!

经验教训

  1. 对于通过枚举其原子创建的集合,排序模块以任何方式对集合进行排序。

  2. 对于由签名创建的集合,排序模块以这种方式对集合进行排序:Blah0,Blah1,Blah2,...,其中“Blah”是签名名称。

  3. 然而,我认为真正的教训是,排序模块(first, last, next, etc.)中提供的功能使显示表明该集合是有序的。但这是一种幻觉,它只是放置在集合之上的视图。事实上,这套装置没有订购。

    我是否有正确的理解?你会添加什么?

2 个答案:

答案 0 :(得分:1)

这种差异背后的原因有两个词:对称性破坏。 简而言之,Alloy希望避免返回同构实例(与标签重命名相同的实例)。

这样想:

当您分析仅由签名组成的模型时,{}分析器将返回由原子时间$ 0组成的单个实例。标记此原子Time $ 1,Time $ 2或CoolAtom不会改变实例由Time类型的单个原子组成的事实。

当分析将颜色声明为红色,黄色或绿色的模型时,分析仪将返回3个实例,每个实例由不同的颜色组成。 你为什么问?那是因为这些原子在语义上不同,因为它们没有相同的类型。

请注意,绝不会创建枚举其原子的集合。您已将颜色集定义为由多个集合(红色,绿色,黄色)组成,这些集合恰好具有一个arity。

然而,你的最终理解是正确的,因为使用排序并不会改变它所使用的签名的本质(定义一组原子),而是提供用于定义键入元素的排序的函数。通过上述签名。

答案 1 :(得分:1)

当您在某个集合S上调用排序模块时,您只需向每个实例添加一个排序,就好像您在集合S上明确包含同类关系一样。正如Loic所说,这比执行它更好的关键原因明确地说,你可以免费获得对称性,从而获得更好的性能(以及更方便的原子编号)。当然,你不需要自己对订单进行公理化。