ForAll并在OCL中使用Iterator进行过滤

时间:2015-02-05 20:01:54

标签: uml ocl

我需要在OCL中执行2个函数来处理集合:forAll和filter。诀窍是我只能使用迭代器

这就是我的意思:

context Collection(T)::forAll(expr) : Boolean
    body : self -> iterate(t: T, acc: Boolean = true | expr(t) and acc)

context Collection(T)::filter(expr) : Collection(T)
    body : self -> iterate(t: T, acc: Collection(T) = {} | if expr(t) then acc->include(t) else acc endif

请告诉我它是对还是错。

1 个答案:

答案 0 :(得分:0)

您对forAll的定义很好,实际上它与OCL Version 2.4的第11.9节(预定义迭代器表达式的映射规则)中给出的相同。

filter操作等同于OCL定义的select操作,其操作几乎与您的操作相同,但有以下区别:

  • 应该是acc->including(t)而不是acc->include(t)
  • Collection是一个抽象类型,然后我想你不能写acc:Collection(T) = {},因为acc的实际类型是未定义的。相反,您可以使用Bag(T) = Bag{}(但在这种情况下,Set(T)::filter(expr)会返回Bag而不是Set)。

OCL规范通过为每种集合类型(然后我们有selectSet(T)::select(body):Set(T)等)单独定义Sequence(T)::select(body):Sequence(T)来解决此问题,在每种情况下使用不同的累加器类型。< / p>