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

ForAll and filter with Iterator in OCL

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

这是我带来的:

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

请告诉我是对还是错。

你对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) 会 return 一个 Bag 而不是 Set)。

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