假设我们有两个模块A和B,(A在B中打开)
你从A生成一个解决方案,并且在B中有一些参数化谓词,只有A BUT元素的原因,由于某些原因你不能将这些谓词放在模块A中。
如何评估从A?
生成的解决方案中B中声明的谓词以下是我尝试达到此目标的以下步骤(未成功)
IF 谓词主体不包含对模块A元素的任何引用,因此评估成功。 ELSE 会产生类似的致命错误:
字段“字段(Sig&lt ;: field)”在翻译期间未绑定到合法值。
答案 0 :(得分:2)
我设法评估在一个模块中声明的谓词,该模块不同于用于生成解决方案的模块,但只能通过在String级别工作的脏解决方法。
以下是我遵循的步骤:
提取所有谓词的主体并将它们映射到它们的名称(通过自己解析文件)
使用Alloy API提取这些谓词所采用的参数的名称(更方便,但也可以通过直接解析模块的内容来检索它们)
在每个正文中(在步骤1中恢复)替换所需表达式出现的参数名称(在步骤2中恢复)。 (您要与参数关联的值,无论是sig,原子还是任何其他合金表达式)
将3中获得的物体解析为Alloy Expression(使用CompUtil.parseOneExpression_fromString)并在解决方案中对其进行评估。
肮脏......但正在努力......; - )
答案 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的边界,而不是您传递的那个。