考虑下面的Alloy模型,这是学生提交的精简版本。问题是课程安排系统,学生试图说没有冲突(两个不同的课程同时在同一个地方开会):
abstract sig Room{}
one sig S20, S30, S50 extends Room{}
abstract sig Period{}
one sig Mon, Tue, Wed, Thu, Fri extends Period{}
// Courses and the room and periods when they meet.
some sig Course {
where : Room,
when : some Period
}
// No two Courses with any common meeting Periods can be
// in the same Room - from the student.
pred NoRoomConflicts_student {
no c : Course | no d : Course |
c != d && some c.when & d.when && d.where = c.where
}
run NoRoomConflicts_student
// No two Courses with any common meeting Periods can be
// in the same Room - my recasting.
pred NoRoomConflicts_alt {
no c : Course, d : Course |
c != d && some c.when & d.when && d.where = c.where
}
run NoRoomConflicts_alt
当运行NoRoomConflicts_alt时,我们会得到符合规范的解决方案。
但是当运行NoRoomConflicts_student时,突然“d”成为课程之间的二元关系,解决方案显示冲突。
(a)为什么“d”以这种方式转变?
(b)给定(a),不应该c!= d引发类型错误?
注意:我并没有声称这两个谓词是等价的(我的头部疼痛试图进行双重否定) - 我只是想知道当运行NoRoomConflicts时“d”突然变成二元关系。
版本:Alloy Analyzer 4.2_2015-02-22(建造日期:2015-02-22 18:21 EST)
答案 0 :(得分:1)
首先,您在解决方案中看到的是某些量化变量(在这种情况下为d)得到了分析,以便您可以看到它们的值。如果你正在解决形式的约束(所有x | some y | ...),y的skolemized值必须是一个关系 - 给每个x的y值。这不是Alloy变量的实际类型,这就是没有类型错误的原因。有关完整说明,请参阅本书(软件抽象)的第5.2.2节。
其次,这两个公式不一样。这在我的书的第293页有解释。简而言之,这是因为“没有c,d | P”意味着你找不到ac和d这样的P,而且“no c | no d | P”意味着你找不到ac这样你找不到广告,如P。