你看着一个非常黑暗的角落。我第一次实际测试这个功能的尝试失败了,因为没有找到一个可以实际绘制图 7.1 的 UML 工具。一旦我掌握了文本,我意识到有很多问题;两种不同的 x[y] 语法之间的潜在冲突,QVTo 缩写进一步加剧了这种冲突。扩展到多于二元关联存在问题。OCL 抽象语法继续使用 UML 1.x 的 AssociationEnd 概念而不是 UML 2.x 属性。
因此,您观察到的功能是某些工具供应商尽最大努力理解非常不充分的规范的结果。
使用 MagicDraw,您曾经使用 Dresden OCL,但我知道 MagicDraw 已切换到 Eclipse OCL,也许是 Classic Eclipse OCL。NoMagic 似乎对他们重新分发的开源软件非常谨慎。
对于较新的 Pivot Eclipse OCL,我在其中对许多 OMG OCL 问题的解决方案进行了原型设计,UML 到 Pivot 加载规范了许多 UML 概念,因此关联是多余的,除非对关联的显式导航需要具体化关联类。对于每个似是而非的导航,关联类被规范化为具有普通属性的关联类。
我认为你的表达不正确。
self.C[b] 不能是合格的关联,因为隐式 A::C 属性没有键。
self.C[b] 可以是一个明确的导航 A::C,其中 A::C 的歧义通过选择对面的 C::b 来解决。但是 A::C 不是模棱两可的,它的反义词是 C::a。所以 self.C 应该是足够的, self.C[a] 是多余的, self.C[b] 是错误的 b。可悲的是,您的工具不喜欢 self.C,因此您的工具有缺陷。
我认为你应该写 self.C.val.mod(2) = 0。
大写 C 是正确的。OCL <= 2.2 遵循 UML 样式指南错误地建议小写。请参阅 OCL 2.4 的 7.5.4 中“缺少关联结束名称”下的缩进段落。