递归的 ocl 约束 class

ocl constraint with recursive class

关于一点上下文:一个 Class 可以有其他 Class 作为 Requirement 由学生采取。 ClassStudent 通过 ClassGroup 获取,可以使用其属性 sessionYear.

及时排序

我想放置一个 OCL 不变约束,它将检查 sessionYearClassGroup 是否在此 [= 之前​​已经采用了它的 Class Requierement 17=]。

换句话说:sessionYear for Requirement < sessionYear for Class

我尝试了很多约束,最接近的尝试是这个:

context Etudiant inv C6: if ClassTaken->notEmpty then classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear)) else true endif

但问题是,在 forAll(sy| sy->sy < cs.sessionYear) 中,sy 将不是 ClassGroup 所需的 Student ClassTaken,而是 ClassGroup包含每个 OfferedGroup 实例的包 Requirement

尝试相当多的约束是黑客行为,并不总能在合理的时间内产生令人满意的结果。

OCL 是一种可读性适中的形式语言。

一旦您用英语(或法语或...)清楚地表达了约束的意图,您应该会发现它可以相对容易地音译成 OCL。

Think/design 请勿破解。

我最终做了这样的事情:

context Student
 inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer 
 and if preIns.ClassTaken = insc.ClassTaken then true
  else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))