了解Alloy基数

时间:2015-03-26 20:37:39

标签: alloy

我无法理解Alloy基数。我把我的代码缩减到这个简单的例子,A​​lloy找不到实例:

sig A {}
sig B { s: set A}

fact x { one n: Int  | all b: B | #(b.s) = n }
run {} for 10

即B.对于B的所有成员,B.s的基数必须相同。为什么Alloy不能找到这样的例子?

2 个答案:

答案 0 :(得分:2)

如果您将run命令更改为run {} for 10 but 5 int,则应该开始查看实例。

这不是一个令人满意的答案(我希望Alloy团队的一个成员可以做得更好),但看起来好像当前Int是内置的,它并不总是实例化。当没有Int的实例时,无法满足这一事实。 (注释掉事实,生成一个实例,然后让评估者评估表达式Int。当我这样做时,评估者返回{}。)

我很乐意更好地解释这一点,但我没有成功地找到或发现确定何时生成Int原子以及何时不生成Int原子的规则。

答案 1 :(得分:1)

在“选项”中,您可以将消息详细程度设置为“高”。在那里,当你运行一个命令时,你会看到位宽(确定合金的最大Int)是0.默认情况下这是4,我不知道发生了什么。

正如另一个答案所建议的那样,将Int设置为某个值会增加位宽,从而增加Alloy允许的最大Int值。

在Alloy中真的不鼓励使用Int。这是一种编写相同语句的方法,避免使用Int:

sig A {}
sig B { s: set A}

fact x { all b,b2: B | #(b.s) = #(b2.s) }
run { some B.s and #B>1} for 10

我在run语句中添加了一些内容,只是为了看到一些有趣的实例