为任何新手错误道歉 - 这是我第一次在这里发帖。
我不确定这是不是一个错误,或者是合金的类型检查中的一些微妙的结果。在下面的例子中,我希望谓词“奇怪”是不一致的,因为B和C是不相交的集合。但是,Alloy(版本4.2)声称可以找到谓词的模型。它显示的模型看起来不对。例如,有一个模型只包含一个原子,B $ 0,标记为见证人$ strange_a。在这个模型中,Evaluator告诉我isB [B $ 0]为真,isC [B $ 0]给出了一个类型错误,正如预期的那样。但是,奇怪的[B $ 0]评估为真。我正在使用的合金代码是:
abstract sig A {}
sig B, C extends A {}
pred isB [b:B] { }
pred isC [c:C] { }
pred strange [a:A] {isB[a] and isC[a]}
run strange
答案 0 :(得分:1)
你是对的:这很令人惊讶。 Alloy的类型检查器使用谓词和函数的decls来检查它们的主体,但它不会将它们强加为约束,除非谓词或函数在顶层运行。我们这样做是因为我们无法在所有使用上下文中找到这些约束的连贯语义(例如,在量词内部或在否定时调用谓词)。