Alloy中两个表达式之间的差异?

时间:2016-10-24 00:50:56

标签: alloy

假设我们有以下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语法,它实际上说的是什么?)

1 个答案:

答案 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