为什么NoRoomConflicts生成二元关系,而NoRoomConflicts_alt“工作”

时间:2017-02-23 19:29:44

标签: alloy

考虑下面的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)

1 个答案:

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