【发布时间】:2018-02-11 21:57:09
【问题描述】:
当使用集合调用排序模块时,所有这些函数突然在集合上可用: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 返回什么?
让 Alloy 生成一些实例:
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.) 中提供的函数使得 看起来 集合是有序的。但那是一种错觉,它只是放在场景顶部的一个视图。事实上,这个集合没有顺序。
我的理解是否正确?你有什么要补充的吗?
【问题讨论】:
标签: alloy