2015-08-02 2 views
1

У меня есть следующая формула в логике первого порядка.Вложенные OCL forAlls

forAll a:A | forAll b :B | if a.r1=b then a.r2=b 

просто, для всех объектов типа А, так и для всех объектов типа B, если они связаны с r1, то они связаны соотношением r2, а также.

Вот диаграмма классов:

enter image description here

Может кто-нибудь обеспечить OCL представление указанной выше формуле пожалуйста.

+0

У вас не получилось ответить на ваш вопрос? Там не было ни поддержки, ни принятия. –

+0

Прокомментируйте, пожалуйста, ваш ответ. Я отправил ответ, полученный с форума Eclipse OCL. – qartal

ответ

0

Вопрос в ответах here.

повторяет ответ следовать стека правилам переполнения:

A.allInstances()->forAll(a | B.allInstances()->forAll(b | a.r1=b implies 
a.r2=b)) 

Это кажется очень громоздким для меня! но кажется, что это такое!

+0

Использование 'allInstances()' сильно обескуражено, так как оно имеет плохую производительность (помните: OCL также может быть выполнен). Скорее используйте 'context A: inv:' и внутри этого использовать 'self'. – mike

1

У меня нет удобного способа проверить это, но я думаю, что синтаксис r1->forall(i | r2->exists(i)).

Возможно, более просто, если вы просто хотите сказать, что r1 является подмножеством r2, вы можете просто объявить об этом.

+0

r1 - это ссылка не класса. Он не может использоваться как набор в OCL (насколько мне известно), поскольку вы написали его здесь (т. Е. «R1-> forall» не является приемлемым синтаксисом) – qartal

+1

Просто напишите его как «context A: inv: self.r1-> forAll (i | self.r2-> существует (i)) ', который решает проблему синтаксиса. – mike

Смежные вопросы