为什么可能合金负基数

时间:2014-01-10 19:17:16

标签: set alloy cardinality

我用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)

2 个答案:

答案 0 :(得分:1)

如果要排除所有具有溢出的模型,可以在4.2版中设置“禁止溢出”。

答案 1 :(得分:0)

事实上,我强制要求每个FSA_state的转换次数应为负数。 在您的签名FSA_state中,使用关键字“some”强制转换的数量至少为一。

在你设法生成的实例中,Alloy利用了整数签名的有限范围,以满足两个矛盾的约束。

实际上,如果整数的范围从-2到3,那么如果每个状态的转换数为4,则#(f.transition)将为-2。

TL; DR: 删除i事实(关键字some已经强制执行每个FSA_state至少有一个转换)