假设我们有以下Alloy模型:
abstract sig Season {}
one sig Spring, Summer, Fall, Winter extends Season {}
abstract sig Student {
bornIn: one Season
}
abstract sig Freshman, Sophomore extends Student {}
one sig John, Walter extends Freshman {}
one sig Sarah extends Sophomore {}
pred isCompatibleWith(s1, s2: Student) {
s1.bornIn = s2.bornIn
}
我想说,大二的莎拉不能与任何新生兼容。
fact {
not Sarah.isCompatibleWith[Freshman]
}
Alloy对我的语法感到满意。我添加了一个断言:
assert WhyDoesThisNotHold {
not Sarah.isCompatibleWith[John]
}
但是,合金找到了一个反例:莎拉和约翰都出生在夏天!
然而,当我将fact
更改为此时,Alloy找不到反例:
fact {
no f: Freshman | Sarah.isCompatibleWith[f]
}
两种语法之间有什么区别,为什么第一种语法不能按照我的意图运作? (因为它是有效的Alloy语法,它实际上说的是什么?)
答案 0 :(得分:1)
您的第一个事实并不像您期望的那样,因为您使用所有isCompatibleWith
的集合作为参数调用谓词Freshman
,但是此谓词并不意味着检查两组之间的兼容性学生们。 (可以通过交叉运算符=
替换&
符号,并检查结果集是否为空。
我现在将向您展示这一事实是如何阻止John和Sarah兼容的。 假设莎拉和约翰出生在夏天,沃尔特出生在冬天,那么事实就是因为:
not Sarah.isCompatibleWith[Freshman] = not Sarah.isCompatibleWith[Walter+John]
= not Sarah.bornIn=(Walter+John).bornIn
= not Summer = (Summer+Winter)
= not false
= true