如何在给定解决方案中评估在与用于生成上述解决方案的模型不同的模型中声明的谓词

时间:2013-12-13 13:47:05

标签: alloy

假设我们有两个模块A和B,(A在B中打开)

你从A生成一个解决方案,并且在B中有一些参数化谓词,只有A BUT元素的原因,由于某些原因你不能将这些谓词放在模块A中。

如何评估从A?

生成的解决方案中B中声明的谓词

以下是我尝试达到此目标的以下步骤(未成功)

  1. 从A
  2. 生成解决方案
  3. 使用B
  4. 的所有可到达签名阅读此解决方案
  5. 根据A
  6. 解析表达式作为参数
  7. 检索B
  8. 中声明的谓词
  9. 使用步骤3中定义的参数,在步骤2中读取的解决方案中评估步骤4中检索到的谓词。
  10. IF 谓词主体不包含对模块A元素的任何引用,因此评估成功。 ELSE 会产生类似的致命错误:

    字段“字段(Sig&lt ;: field)”在翻译期间未绑定到合法值。

2 个答案:

答案 0 :(得分:2)

我设法评估在一个模块中声明的谓词,该模块不同于用于生成解决方案的模块,但只能通过在String级别工作的脏解决方法。

以下是我遵循的步骤:

  1. 提取所有谓词的主体并将它们映射到它们的名称(通过自己解析文件)

  2. 使用Alloy API提取这些谓词所采用的参数的名称(更方便,但也可以通过直接解析模块的内容来检索它们)

  3. 在每个正文中(在步骤1中恢复)替换所需表达式出现的参数名称(在步骤2中恢复)。 (您要与参数关联的值,无论是sig,原子还是任何其他合金表达式)

  4. 将3中获得的物体解析为Alloy Expression(使用CompUtil.parseOneExpression_fromString)并在解决方案中对其进行评估。

  5. 肮脏......但正在努力......; - )

答案 1 :(得分:1)

  

你从A生成一个解决方案,并且在B中有一些参数化谓词,只有A BUT元素的原因,由于某些原因你不能将这些谓词放在模块A中。

不,你不能那样做。当您获得模块A的解决方案时,解决方案将不会知道有关模块B的任何信息(因为A不包含/打开B),所以您可以不从B获取谓词,并根据A的解决方案对其进行评估。

我理解你的观点,为什么你从概念上认为你应该能够做到这一点。在一个单独的文件中存储一些额外的谓词,然后将它们解析并解析为表达式似乎是合理的,因为通常你应该能够针对任何解决方案评估任何表达式,你可能希望你的原始场景能够工作。然而,在实践中,当您解析来自B的谓词来解析来自A的某个sig或字段的谓词时,表示该sig / field的对象在物理上与该对象相同。从模块A解析时的sig / field。因此,您会收到错误,说“sig / field未绑定到合法值”,只是因为存在“其他”sig / field的边界,而不是您传递的那个。