Alloy 理解合金基数

Alloy 理解合金基数,alloy,Alloy,我无法理解合金基数。我将代码简化为Alloy找不到的一个简单示例: sig A {} sig B { s: set A} fact x { one n: Int | all b: B | #(b.s) = n } run {} for 10 也就是说,对于B的所有成员,B.s的基数都必须相同。为什么Alloy找不到这样的例子呢?如果将run命令更改为run{}10,但是5 int你应该开始看到实例了 这并不是一个令人满意的答案(我希望Alloy团队的一名成员能做得更好),但看起来眼前的问题

我无法理解合金基数。我将代码简化为Alloy找不到的一个简单示例:

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

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

也就是说,对于B的所有成员,B.s的基数都必须相同。为什么Alloy找不到这样的例子呢?

如果将
run
命令更改为
run{}10,但是5 int
你应该开始看到实例了

这并不是一个令人满意的答案(我希望Alloy团队的一名成员能做得更好),但看起来眼前的问题是,尽管Int是内置的,但它并不总是实例化的。如果没有Int的实例,则无法满足该事实。(注释掉事实,生成一个实例,然后让计算器计算表达式
Int
。当我这样做时,计算器返回{}。)


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

在选项中,您可以将消息详细性设置为高。在那里,当您运行命令时,您将看到bitwidth(它决定Alloy的max 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语句中添加了一些内容,只是为了查看一些有趣的实例