Вы отлично поработали, используя формальный английский, поэтому транслитерация в OCL теперь проста.Но вы использовали List <>, который не является средством UML или OCL, поэтому, не предоставляя свои операции, кто знает?Поэтому я предполагаю, что вы используете какую-то форму Коллекции, возможно, Последовательность.(В UML Коллекции вы получаете автоматически, указав верхнюю границу больше 1.)
В идеале вы можете транслитерировать в:
pre->forAll(s |
(s.contains('not') and (s.count(' ') = 1)) or (s.count(' ') = 0))
, но в стандартном OCL нет String :: contains () илиString ::: count (), поэтому нам придется работать немного усерднее.В Eclipse OCL есть String :: tokenize (), String: lastIndexOf () и String :: match (), любой из которых может быть использован.Но в Стандартном OCL нам, вероятно, придется прибегнуть к символам (), чтобы создать Последовательность строк, каждый из которых содержит один символ.
For s.contains('not') use s.indexOf('not') >= 0
For s.count(' ') use s.characters->count(' ')
и чтобы избежать вычисления s.characters-> count ('') дважды приплохой инструмент OCL, введите переменную let.