如何定义Int的范围

时间:2014-11-10 12:05:55

标签: alloy

我使用合金4.2来定义Int的范围使用' for ...但是......'语法,但似乎 它忽略了我的要求。例如,给出以下简单模型:

sig A {
  y : seq A
}

run { some a : A | #(a.y) = 4} for 3 but 4 Int

run { some a : A | #(a.y) = 4} for 4 Int, 3 A

第一个run在第二个找到实例时找不到实例。据我了解这些 两个命令是等价的(除非有一些隐藏的签名,其范围是自动推导出来的)。

有人可以阐明这种行为吗?

1 个答案:

答案 0 :(得分:5)

这两个运行命令在假设用于“索引”序列y的A原子的原子是由签名Int键入的情况下是等效的。

虽然这个假设似乎足够合理,但事实并非如此,因为序列索引是由签名“seq / Int”键入的。 因此,增加Int的范围将不会影响序列的最大长度。

要完成您打算做的事情,您可以将范围分配给“序列本身”。 这样做如下:

run { some a : A | #(a.y) = 4} for 3 but 4 seq

有关序列的答案和其他信息可在以下地址找到: http://alloy.mit.edu/alloy/documentation/quickguide/seq.html

编辑:(比评论更具可读性)

请注意

1。run { some a : A | #(a.y) = 4} for 4

有效,

2. run { some a : A | #(a.y) = 4} for 3

不起作用。

现在有趣的是

3。run { some a : A | #(a.y) = 4}

即使已知默认范围为3,

仍然有效。 从这些实验中我们可以得出结论:

  • 1和2向我们显示事实实例被发现或没有,不依赖于您为签名Int分配的范围
  • 3让我猜测,如果你没有明确定义全局范围,那么给定你正在运行的谓词时,分析器“足够聪明”以适应seq / Int的范围。