我有一个非常简单的合金模型。它应该只将最多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
我的模型有问题吗?
答案 0 :(得分:5)
如果模型是用于分析它的范围,那么模型中没有什么特别的错误。
请注意,事实上,您检查与诊所相关的医生人数。现在,您在运行命令中强制执行了恰好有100名医生。
在Alloy中使用数字时,您应该始终小心,因为您可以使用的整数范围取决于通过其范围分配给它们的位宽。
默认情况下,整数范围为4,因此整数范围为-8到7。
回到你的问题:
为什么诊所有超过5名医生?
假设有8名医生被分配到诊所,您提供的事实怎么能让这种情况发生?合金在给定[-8,7]的范围内不能代表8,因此发生“溢出”,导致分配给诊所的医生数量 -8 的令人惊讶的结果。 -8确实小于5的事实是你的模型允许例如8名医生将与一家诊所相关联。
如何修复:
其中两个选项:
答案 1 :(得分:1)
小心你的范围。为什么你需要100名医生?
请注意,有100名医生和1名诊所,关系医生有2 ^ 100 = 10 ^ 30的值。请记住,Alloy Analyzer就像模型检查器,因此您必须观察状态空间。没有模型检查员会对这种状态空间感到满意。