当其中一个被取消时,变量值对(即映射)不会被保留

Variable-Value pairs (i.e., maps) are not retained when one of them gets nullified

我有以下简单模型,我在其中尝试模拟数据集中 select 数据的无效化。 Data to Val (d2v) 映射是一个称为 Dynamic 的签名字段,其实例对应于模型的不同状态(之前和之后)。当我尝试模拟这个模型时,我得到了两个不相关的 Dynamic 实例,即使我明确地将两个 Dynamic 实例的 d2v 映射设置为相同(当然除了传递给无效谓词的 Data 实例的映射)。换句话说,两个 Dynamic 实例的变量值对不匹配。我错过了什么?


sig Data {}
sig Val {}

sig Dynamic {
  d2v: Data -> lone Val,
}

pred nullify [dyn, dyn': Dynamic, d:Data] {
  d in dyn.d2v.univ implies
    dyn'.d2v = dyn.d2v - (d -> d.(dyn.d2v))
  else
     dyn'.d2v = dyn.d2v
}

run nullify for exactly 3 Data,
                exactly 3 Val,
                exactly 2 Dynamic



下面是来自 Alloy 的两个 Dynamic.d2v 实例的评估示例:

sig Dynamic
   Dynamic[=11=]
      field d2v
         Data -> Val
   Dynamic
      field d2v
         Data[=11=] -> Val
         Data -> Val[=11=]

其中Data$2 是删除谓词的参数。例如,我期望的是以下内容:

sig Dynamic
   Dynamic[=12=]
      field d2v
         Data -> Val
         Data[=12=] -> Val
         Data -> Val[=12=]
   Dynamic
      field d2v
         Data[=12=] -> Val
         Data -> Val[=12=]

您确定实例将 dyn 和 dyn' 绑定到 Dynamic$0 和 Dynamic$1 吗?例如,它可以将它们都绑定到 Dynamic$1,满足谓词的 else 分支。