Alloy5的奇怪签名约束行为(git commit 30b41ae8125f69657)

时间:2018-11-29 17:11:36

标签: alloy

有人可以在这里澄清问题所在吗

enum Stage { Receive, Check, Drop, Save, Forward, Delivered }

sig StartStage in Receive {}
-- { StartStage = Receive } -- do not constrain StartStage???
-- if uncommented here, but commented in fact below, then StartStage may be empty
-- Why? Is it a bug?

sig FinalStage in Drop + Delivered {}

fact {
  StartStage = Receive
  FinalStage = Drop + Delivered
}

在此代码中,只能通过单独的事实部分来约束StartStage。为什么?

1 个答案:

答案 0 :(得分:0)

不确定,为什么有人投反对票,因为我的问题可能对新手有用。

答案很简单,在签名字段部分之后的约束部分中,存在隐式量化:

枚举E {A,B,C}

sig S {} {S = A + B}  实际上是 sig S {} {所有这些:S | S = A + B} 它由两个S值满足:空集{}和A + B集。

它在文档中提到(隐式量化),但在某些情况下,对于初学者(例如我),AlloyTools的行为可能看起来有些出乎意料。