为什么 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。
考虑下面的 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。