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
来解决这个问题,并在每种情况下使用不同的累加器类型.
我需要在 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.
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
来解决这个问题,并在每种情况下使用不同的累加器类型.