/*
sig a {
}
sig b {
}
*/
pred rel_test(r : univ -> univ) {
# r = 1
}
run {
some r : univ -> univ {
rel_test [r]
}
} for 2
运行此小测试, $ r 在每个生成的实例中包含一个元素。但是,当 sig a 和 sig b 取消注释时,第一个实例就是:
在我的解释中, $ r 在这里有9个元组,而且,要求一个元组关系的谓词成功。我哪里错了?
一个辅助问题:这两个声明是否相同?
pred rel_test(r : univ -> univ)
pred rel_test(r : set univ -> univ)
答案 0 :(得分:2)
问题是,当Forbid Overflow选项设置为No时,Alloy中的整数语义会回绕,默认范围为3(位),然后确实为9 = 1,因为您可以在求值程序中确认。 / p>
使用签名a和b注释,范围2可以生成的最大关系有4个元组(因为univ的最大大小是2),所以问题不会发生。
它也不会出现在最新的构建中,因为我认为它默认情况下将Forbid Overflow选项设置为Yes,并且使用该选项,整数的语义排除了溢出发生的实例,正是在计算时出现溢出的情况。与9元组的关系的大小。关于这种替代整数语义的更多细节可以在文章"防止合金中的算术溢出"亚历山大·米利切维奇和丹尼尔·杰克逊。
答案 1 :(得分:1)
关于主要问题:您使用的是什么版本的Alloy?我无法复制您描述的行为(在OS X 10.6.8上使用2015年2月22日的合金4.2)。
关于辅助问题:看起来如此。 (语言参考并不像人们希望的那样明确,但它开始讨论多重性的一部分用"如果右手表达式表示一元关系......"和(在什么我认为是如此定义的上下文)"默认的多重性是一个&#34 ;;如果默认的多重性总是一个,那么条件就没有意义。
另一方面,相同的解释逻辑将得出结论,语言参考认为只有在表示一元关系的表达式之前允许一元多重性关键词(这似乎使得r: set univ -> univ
不符合语法)。但Alloy接受表达式并将其解析为set (univ -> univ)
。 (替代解析(set univ) -> univ
,很难赋予意义。)