Alloy 合金中的数学运算

Alloy 合金中的数学运算,alloy,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 e

我有一个非常简单的合金模型。它最多只能将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
abstract-sig-Clinic{
医生:医生
}
抽象符号医生{
}
事实医生限制{

所有c:Clinic |#c.doctors如果您使用的是分析范围,那么您的模型没有什么特别错误

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

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

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

回到你的问题:

为什么一个诊所有5名以上的医生?

假设有8名医生被分配到诊所,你提供的事实怎么会让这种情况发生呢?Alloy不能代表给定范围内的8名医生[-8,7],因此“溢出”发生,导致一个令人惊讶的结果,即分配给该诊所的医生人数为-8。事实上-8确实小于5是您的模型允许8名医生与单个诊所关联的原因

如何解决此问题:

除其他外,有两种选择:

  • 减少医生人数
  • 增加整数的范围。为了表示足够多的整数,您需要至少8的位宽,以便“帧”这100个医生。运行..for 8 Int将为您提供以下整数范围:[-128127]

如果您使用的是分析范围,那么您的模型没有什么特别错误

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

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

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

回到你的问题:

为什么一个诊所有5名以上的医生?

假设有8名医生被分配到诊所,你提供的事实怎么会让这种情况发生呢?Alloy不能代表给定范围内的8名医生[-8,7],因此“溢出”发生,导致一个令人惊讶的结果,即分配给该诊所的医生人数为-8。事实上-8确实小于5是您的模型允许8名医生与单个诊所关联的原因

如何解决此问题:

除其他外,有两种选择:

  • 减少医生人数
  • 增加整数的范围。为了表示足够多的整数,您需要至少8的位宽,以便“帧”这100个医生。运行..for 8 Int将为您提供以下整数范围:[-128127]

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


      请注意,对于100个医生和1个诊所,关系医生有2^100=10^30个值。请记住,合金分析仪就像一个模型检查器,因此您必须观察状态空间。没有模型检查器会喜欢这种状态空间。

      请注意您的范围。为什么需要100个医生


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

      “在Alloy中玩数字时应始终小心”.非常好的原则,措辞精辟。“在合金中玩数字时,你应该始终小心”很好的原则,很好的措辞。我不需要那么多,我只是检查。但是我不认为合金分析仪检查所有的关系,当我找到一对夫妇时,它停止了。但是谢谢你的建议,我以后会考虑这个。我不需要那么多,我只是检查。但是我不认为合金分析仪检查所有的Rela。当我找到一对夫妇的时候,它就停止了。但是谢谢你的建议,我以后会考虑的。