集合大小的 ocl 约束

ocl constraint on collection size

draw of my situation
在link上面,我们可以看到classStudentClass。我想做一个不变的约束来确保 Student 每个 sessionYear 不能注册超过 5 classes。

有了这个约束,我可以确定 Student 是否大于 5 classes

context Student
inv maxClassStudent: classTaken->collect(sessionYear)->size() < 6

但是,我想要的是找到仅由相同 sessionYear 形成的集合的大小。换句话说,我希望为每个不同的 sessionYear 制作一个集合,以验证那一年 Student 是否少于 6 个 class。

我想我也许可以利用 forAll(c1,c2|c1<>c2 implies c1.sessionYear <> c2.sessionYear) 或基于 sessionYear 的差异 Class 类似的东西,但我似乎无法弄清楚。

难题通常可以通过分解成更小的部分来解决...

let sessionYears = classTaken->collect(sessionYear)->asSet() 在 sessionYears->forAll(sy | classTaken->select(sessionYear = sy)->size() < 6)