Uml OCL:如何编写max操作的前置和后置条件,以便从集合中找到最大值?
我试图编写前置和后置条件,以找到集合“col”的最大值。我真的不知道该怎么做,所以我想知道是否有人能帮忙Uml OCL:如何编写max操作的前置和后置条件,以便从集合中找到最大值?,uml,preconditions,ocl,post-conditions,Uml,Preconditions,Ocl,Post Conditions,我试图编写前置和后置条件,以找到集合“col”的最大值。我真的不知道该怎么做,所以我想知道是否有人能帮忙 pre: true post: result = ... 如果我理解正确,这可能会有所帮助: 先决条件是在执行方法之前必须满足的条件。这主要是关于输入数据的一些断言,例如集合不为null。 Post条件定义在方法完成后将为真的内容。在您的情况下,例如: 该方法返回的元素在给定集合中的值为最大值。如果我理解正确,这可能会有帮助: 先决条件是在执行方法之前必须满足的条件。这主要是关于输入
pre: true
post: result = ...
如果我理解正确,这可能会有所帮助: 先决条件是在执行方法之前必须满足的条件。这主要是关于输入数据的一些断言,例如集合不为null。 Post条件定义在方法完成后将为真的内容。在您的情况下,例如:
该方法返回的元素在给定集合中的值为最大值。如果我理解正确,这可能会有帮助: 先决条件是在执行方法之前必须满足的条件。这主要是关于输入数据的一些断言,例如集合不为null。 Post条件定义在方法完成后将为真的内容。在您的情况下,例如: 该方法返回的元素在给定集合中的值为最大值。我将执行的操作:
pre: not col.isEmpty()
post: col -> includes(result) and col -> forAll(a | a <= result)
它的语义是:
此forAll表达式生成布尔值。如果布尔表达式对的所有元素均为真,则结果为真
收集如果集合中的一个或多个v的布尔表达式-with-v为false,则完整表达式
计算结果为false。例如,在公司环境中:
示例:
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 )
context公司
inv:self.employee->forAll(年龄forAll)(p | p.age forAll)(p:Person | p.age我会做什么:
pre: not col.isEmpty()
post: col -> includes(result) and col -> forAll(a | a <= result)
它的语义是:
此forAll表达式生成布尔值。如果布尔值表达式对所有元素均为真,则结果为真
如果集合中的一个或多个v的布尔表达式-with-v为false,则完整表达式
计算结果为false。例如,在公司的上下文中:
示例:
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 )
context公司
存货:自雇员工->所有人(所有人的年龄)(所有人的年龄)(p:Person | p.agepost:result=col->any(a | col->forAll(a2 | a>=a2))
其中,“any”返回满足条件的元素之一,即,与select类似,但保证仅返回单个元素,如果集合中的多个元素满足条件,则随机选择该元素
“any”中的条件通过与所有其他元素进行比较,确保所选元素“a”是集合中的最大值
也请检查这一点。事实上,OCL在处理聚合和其他类型的统计函数方面的局限性是这种语言的一个公开问题。post:result=col->any(a | col->forAll(a2 | a>=a2))
其中,“any”返回满足条件的元素之一,即,与select类似,但保证仅返回单个元素,如果集合中的多个元素满足条件,则随机选择该元素
“any”中的条件通过与所有其他元素进行比较,确保所选元素“a”是集合中的最大值
也请检查这一点。事实上,OCL在处理聚合和其他类型的统计函数方面的局限性是该语言的公开问题之一。OCL将Collection::max()定义为
post: result = self->iterate( elem; acc : T = self.first() | acc.max(elem) )
其中“由元素支持的最大运算必须采用一个T型参数,并且是关联的和可交换的”
我知道应该是这样
post:result=self->iterate(elem;acc:T=self.asSequence()->first()| acc.max(elem))
因为未为集合定义first()
集合转换为序列。累加器(acc
)用序列的第一个值初始化。迭代表达式将累加器更新为当前值acc
和迭代器elem
之间的最大值。如果集合为空,则结果为self.first()
,它是无效的
OCL将集合::max()
定义为
post: result = self->iterate( elem; acc : T = self.first() | acc.max(elem) )
其中“由元素支持的最大运算必须采用一个T型参数,并且是关联的和可交换的”
我知道应该是这样
post:result=self->iterate(elem;acc:T=self.asSequence()->first()| acc.max(elem))
因为未为集合定义first()
集合转换为序列。累加器(acc
)用序列的第一个值初始化。迭代表达式将累加器更新为当前值acc
和迭代器elem
之间的最大值。如果集合为空,则结果为self.first()
,这是无效的
您可能希望使用OCL约束来表示这一点-在哪种情况下是一行的…您将如何实现它?@橡皮擦?:)您可能希望使用OCL约束来表示这一点-在哪种情况下是一行的…您将如何实现它?@橡皮擦?:)+1获取OCL查询的详细说明,以及附加的resources@Jordi事实上,这个答案是有问题的。假设集合有两个最大元素e1
和e2
,也就是说,假设存在e1
和e2
,并且它保持col->forAll(e)|e@gefei,这就是我使用any而不是select迭代器的原因。如果有多个元素具有最大值,any将返回其中一个(随机)@JordiCabotany
返回e1
或e2
,您不知道。而且结果也可以是e1
或e2
,您也不知道。因此result=any(…)
不一定是正确的。请记住,OCL是声明性的,而不是强制性的。我看到我们没有达成一致,所以让读者自己决定吧。+1详细说明