合金断言检查

时间:2013-03-10 20:32:45

标签: assert alloy

我正在尝试编写一个断言声明,表示一旦输入标记 任何学生,然后学生总是有该课程的标记(虽然它可能是 标记可能会改变)。我已经知道如何检查学生是否有分数,但我不知道怎么做,以防学生开始没有任何分数。另外,我如何为这个断言语句写一个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

但不知怎的,它说:这个表达式没有被严格控制。 我是对还是错,如果我是对的,我该如何解决?

1 个答案:

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