7.6.3 ForAll操作

很多情况下,我们需要把约束施加到集合的所有元素上。OCL中的 forAll 操作允许指定一个对集合中所有对象都必须满足的布尔表达式:

collection->forAll(v: Type | boolean-expression-with-v)
collection->forAll(v | boolean-expression-with-v)
collection->forAll(boolean-expression)

forAll表达式产生一个布尔值。如果对于collection的所有元素boolean-expression-with-v都为真,则结果为真。只要collection中有一个vboolean-expression-with-v为假,则整个表达式为假。举个例子,在一个公司上下文中:

context Company
    inv: self.employee->forAll(age <= 65)
    inv: self.employee->forAll(p|p.age <= 65)
    inv: self.employee->forAll(p: Person|p.age <= 65)

如果每个员工的年龄都小于等于65的话,那么上述这些不变式的结果为真。

forAll操作有一个扩展的变体,它可以使用多个迭代器。每个迭代器都要遍历整个集合。实际上,这是一个在集合自身的笛卡尔积上的forAll

context Company inv:
    self.employee->forAll(e1, e2 : Person | e1<>e2 implies e1.forename <> e2.forename)

如果所有员工的forename是不同的,那么该表达式计算为真。它在语义上等同:

context Company inv:
    self.employee->forAll(e1|self.employee->forAll(e2| 
                                e1 <> e2 implies e1.forename <> e2.forename))

results matching ""

    No results matching ""