为什么 NoRoomConflicts 在 NoRoomConflicts_alt "works" 时生成二元关系

Why does NoRoomConflicts generate a binary relation while NoRoomConflicts_alt "works"

考虑下面的 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"变成了Courses之间的二元关系,解决方案显示冲突。

(a) 为什么 "d" 变成这样?

(b) 给定 (a),c != d 不应该引发类型错误吗?

注意:我并不是说这两个谓词是等价的(我的头很痛,想做双重否定)-我只是想知道当 NoRoomConflicts 是 运行.

版本:Alloy Analyzer 4.2_2015-02-22(构建日期:2015-02-22 18:21 EST)

首先,您在解决方案中看到的是某些量化变量(在本例中为 d)被斯科莱姆化,以便您可以看到它们的值。如果您要求解形式为 (all x | some y | ...) 的约束,则 y 的 skolemized 值必须是一个关系——为每个 x 提供一个 y 值。这不是 Alloy 变量的实际类型,这就是没有类型错误的原因。有关完整说明,请参阅我的书(软件抽象)的第 5.2.2 节。

其次,两个公式不一样。这在我的书的第 293 页上有解释。简而言之,就是因为"no c, d | P"表示找不到满足P的c和d,"no c | no d | P"表示找不到满足P的c,所以找不到满足P的d。