我用Alloy语言描述了一些模型。 为了描述有限状态机,我提供了以下几行代码:
sig FSA_state {
transitions: some FSA_state,
initial: lone InitialState
}
sig InitialState {}
fact i {
all f: FSA_state | #(f.transitions) <= 0
}
pred show {
}
run show for 5 but 1 InitialState
现在我想弄清楚为什么它在单个状态下进行的转换超过零。
使用“Evaluator”工具我发现某些世界在设置转换时具有负基数,它是如何可能的(一个集合不能少于零元素)?
我在Evaluator中使用的指令是#(FSA_state.transitions)
答案 0 :(得分:1)
如果要排除所有具有溢出的模型,可以在4.2版中设置“禁止溢出”。
答案 1 :(得分:0)
事实上,我强制要求每个FSA_state的转换次数应为负数。 在您的签名FSA_state中,使用关键字“some”强制转换的数量至少为一。
在你设法生成的实例中,Alloy利用了整数签名的有限范围,以满足两个矛盾的约束。
实际上,如果整数的范围从-2到3,那么如果每个状态的转换数为4,则#(f.transition)将为-2。
TL; DR: 删除i事实(关键字some已经强制执行每个FSA_state至少有一个转换)