我想更多地了解这个错误所涉及的界限。
我有一个合金模型,我手动创建一个实例(通过用XML写下来)。 此实例是可读的,A4Solution可以正确显示。 但是当我尝试使用eval()函数计算此实例中的表达式时,我收到此错误消息,尽管从模型中检索的exprvar的字段名称和类型与实例中的那个完全相同。 / p>
我想知道这个界限是什么的。为了告诉实例的一个元素是否绑定到模型的一个元素,需要考虑哪些属性。
是否考虑了XML中的隐藏ID?
答案 0 :(得分:3)
我想知道这个界限是什么。
这意味着在要求求解器求解公式之前,必须给每个自由变量(即Kodkod中的关系)一个约束。
为了告诉实例的一个元素是否绑定到模型的一个元素,需要考虑哪些属性。
实例XML文件包含模型中每个sig和field的精确值(元组集);那些元组集恰好是在计算表达式时应该使用的边界。我不确定您是如何尝试使用Alloy API的;但是(通常)应该由场景后面的API处理从XML文件重新创建边界。
答案 1 :(得分:3)
根据您对我之前回答的上一条评论,您的问题可能与此post有关。
简而言之,如果您正在尝试评估从一个合金世界获得的AST表达对象" (CompModule
)对于完全从XML文件重新创建的解决方案,您将得到完全错误。例如,如果您有两个PrimSig
个对象,s1
和s2
,并且它们都具有相同的名称(例如,两者都是通过解析sig S {...}
获得的),它们是不是" Java等于" (s1.equals(s2)
返回false
);对于潜在的Kodkod关系/变量也是如此。因此,如果您尝试在仅限s1
的绑定的上下文中评估s2
,则会收到错误消息,指出s1
未绑定。
答案 2 :(得分:2)
在阅读A4Solution时提供元模型中定义的签名集解决了我的问题。 因此改变:
solution = A4SolutionReader.read(null, new XMLNode(f));
通过
solution = A4SolutionReader.read(mm.getAllReachableSigs(), new XMLNode(f));
解决了这个非法的边界问题