한다고 가정 우리는 다음과 같은 합금 모델이 있습니다합금의 두 표현식의 차이점은 무엇입니까?
내가 사라 년생 어떤 신입생와 호환되지 않을해야한다는 것을 말하고 싶은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]
}
합금이 내 구문에 만족합니다.
assert WhyDoesThisNotHold {
not Sarah.isCompatibleWith[John]
}
그러나 합금 카운터 - 예를 발견 : 나는 주장을 추가 사라와 존은 모두 여름에 태어난다!
fact {
no f: Freshman | Sarah.isCompatibleWith[f]
}
무엇 두 구문의 차이가, 그리고 내가 의도 한대로 왜 첫 번째가 작동하지 않습니다 :이에 fact
을 변경할 때 반면
, 합금 카운터 - 예를 찾을 수 있습니까? (이 유효 합금 구문이기 때문에 그리고, 무엇 실제로 말입니까?)이 예상대로 당신은 그러나이 술어에 의미하지 않는다, 매개 변수로 모든 Freshman
세트와 술어 isCompatibleWith
를 호출하기 때문에