我正在尝试编写一个断言声明,表示一旦输入标记 任何学生,然后学生总是有该课程的标记(虽然它可能是 标记可能会改变)。我已经知道如何检查学生是否有分数,但我不知道怎么做,以防学生开始没有任何分数。另外,我如何为这个断言语句写一个check语句?
sig Student, Tutor, Mark {}
sig Course {
reg : set Student,
alloc : Student -> Tutor,
result : Student -> Mark
}
这是我试过的
assert chekmark
{all c:Course | let c' = CO/next[c] |
some Student.(c.Result) => some Student.(c.Result)}
check checkmark for 3
但不知怎的,它说:这个表达式没有被严格控制。 我是对还是错,如果我是对的,我该如何解决?
答案 0 :(得分:1)
问题在于课程的排序不会成为您问题的解决方案。使用订购模块只需在所有课程上下一个总订单(因此CO / next [c]只会按顺序返回c后面的课程),而您可能希望每个(课程,学生)对都有一系列标记
也许是这样的
sig Student, Tutor, Mark {}
sig Course {
reg : set Student,
alloc : Student -> Tutor,
result : set Grade
}
sig Grade {
student: one Student,
marks: seq Mark
}
使用Alloy序列会自动为您提供所需的属性,也就是说,如果marks
字段非空,那么它将包含Marks序列,因此中间不可能有空值。
使用此模型,您可能希望添加一个事实,即每个学生每门课程最多可以执行一个等级。
fact oneGradePerStudentPerCourse {
all c: Course {
all s: c.reg |
lone {g: c.result | g.student = s}
}
}