我使用合金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
在第二个找到实例时找不到实例。据我了解这些
两个命令是等价的(除非有一些隐藏的签名,其范围是自动推导出来的)。
有人可以阐明这种行为吗?
答案 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}
仍然有效。 从这些实验中我们可以得出结论: