合金中的数学运算

时间:2014-12-15 09:13:32

标签: alloy

我有一个非常简单的合金模型。它应该只将最多5名医生附加到诊所,但是当我执行该模型时,它会将超过5名医生附加到诊所。这是我的模特。

abstract sig Clinic {
    doctors : set Doctor
}
abstract sig Doctor {
}
fact ClinicDoctorRestriction {
    all c:Clinic | #c.doctors <= 5
}
pred showresult{
}
run showresult for exactly 1 Clinic, exactly 100 Doctor

我的模型有问题吗?

2 个答案:

答案 0 :(得分:5)

如果模型是用于分析它的范围,那么模型中没有什么特别的错误。

请注意,事实上,您检查与诊所相关的医生人数。现在,您在运行命令中强制执行了恰好有100名医生。

在Alloy中使用数字时,您应该始终小心,因为您可以使用的整数范围取决于通过其范围分配给它们的位宽。

默认情况下,整数范围为4,因此整数范围为-8到7。

回到你的问题:

为什么诊所有超过5名医生?

假设有8名医生被分配到诊所,您提供的事实怎么能让这种情况发生?合金在给定[-8,7]的范围内不能代表8,因此发生“溢出”,导致分配给诊所的医生数量 -8 的令人惊讶的结果。 -8确实小于5的事实是你的模型允许例如8名医生将与一家诊所相关联。

如何修复:

其中两个选项:

  • 减少医生人数
  • 增加整数的范围。你需要为了表示足够的整数至少为8的位宽,以“框架”那100名医生。 run .. for 8 Int将给出以下整数范围:[ - 128,127]

答案 1 :(得分:1)

小心你的范围。为什么你需要100名医生?

请注意,有100名医生和1名诊所,关系医生有2 ^ 100 = 10 ^ 30的值。请记住,Alloy Analyzer就像模型检查器,因此您必须观察状态空间。没有模型检查员会对这种状态空间感到满意。