带递归类的ocl约束

时间:2018-11-12 11:01:05

标签: recursion constraints ocl

在某些情况下:Class可以与其他Class一起作为Requirement供学生使用。 ClassStudent通过ClassGroup获取,sessionYear可以通过其属性sessionYear及时订购。

enter image description here

我想放置一个OCL不变约束,该约束将检查ClassGroupClass的{​​{1}} Requierement是否早于此{{1} }。

换句话说:sessionYear的{​​{1}} <sessionYear的{​​{1}}

我尝试了很多内容,而我最接近的尝试是:

Requirement

但是问题是,在sessionYear中,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)的{​​{1}},而是sy的每个Student实例。

2 个答案:

答案 0 :(得分:0)

尝试很多限制就是黑客行为,并且在合理的时间内并不能总是获得令人满意的结果。

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

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

认为/设计不能破解。

答案 1 :(得分:0)

我最终做了这样的事情:

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)))