当使用集合调用排序模块时,所有这些函数突然在集合中可用: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
不再有实例!
经验教训
对于通过枚举其原子创建的集合,排序模块以任何方式对集合进行排序。
对于由签名创建的集合,排序模块以这种方式对集合进行排序:Blah0,Blah1,Blah2,...,其中“Blah”是签名名称。
然而,我认为真正的教训是,排序模块(first, last, next, etc.
)中提供的功能使显示表明该集合是有序的。但这是一种幻觉,它只是放置在集合之上的视图。事实上,这套装置没有订购。
我是否有正确的理解?你会添加什么?
答案 0 :(得分:1)
这种差异背后的原因有两个词:对称性破坏。 简而言之,Alloy希望避免返回同构实例(与标签重命名相同的实例)。
这样想:
当您分析仅由签名组成的模型时,{}分析器将返回由原子时间$ 0组成的单个实例。标记此原子Time $ 1,Time $ 2或CoolAtom不会改变实例由Time类型的单个原子组成的事实。
当分析将颜色声明为红色,黄色或绿色的模型时,分析仪将返回3个实例,每个实例由不同的颜色组成。 你为什么问?那是因为这些原子在语义上不同,因为它们没有相同的类型。
请注意,绝不会创建枚举其原子的集合。您已将颜色集定义为由多个集合(红色,绿色,黄色)组成,这些集合恰好具有一个arity。
然而,你的最终理解是正确的,因为使用排序并不会改变它所使用的签名的本质(定义一组原子),而是提供用于定义键入元素的排序的函数。通过上述签名。
答案 1 :(得分:1)
当您在某个集合S上调用排序模块时,您只需向每个实例添加一个排序,就好像您在集合S上明确包含同类关系一样。正如Loic所说,这比执行它更好的关键原因明确地说,你可以免费获得对称性,从而获得更好的性能(以及更方便的原子编号)。当然,你不需要自己对订单进行公理化。