有人可以在这里澄清问题所在吗
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。为什么?
答案 0 :(得分:0)
不确定,为什么有人投反对票,因为我的问题可能对新手有用。
答案很简单,在签名字段部分之后的约束部分中,存在隐式量化:
枚举E {A,B,C}
sig S {} {S = A + B} 实际上是 sig S {} {所有这些:S | S = A + B} 它由两个S值满足:空集{}和A + B集。
它在文档中提到(隐式量化),但在某些情况下,对于初学者(例如我),AlloyTools的行为可能看起来有些出乎意料。