Professional Documents
Culture Documents
Introduction To OCL: Bernhard Beckert
Introduction To OCL: Bernhard Beckert
Bernhard Beckert
– p.1
OCL
– p.2
OCL
– p.2
OCL
– p.2
OCL
– p.2
UML is not enough. . .
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.3
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples I
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.4
Some OCL examples II
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.5
Some OCL examples II
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.5
Some OCL examples II
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.5
Some OCL examples II
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: self.fleet–>forAll(v | v.colour = #black)
– p.5
Some OCL examples II
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: self.fleet–>forAll(v | v.colour = #black)
“Nobody has more than 3 black vehicles”:
– p.5
Some OCL examples II
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: self.fleet–>forAll(v | v.colour = #black)
“Nobody has more than 3 black vehicles”:
context Person
inv: self.fleet–>select(v | v.colour = #black)–>size <= 3
– p.5
Some OCL examples III — iterate
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.6
Some OCL examples IV — oclIsKindOf
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: age<18 implies self.fleet–>forAll(v | not v.oclIsKindOf(Car))
– p.7
Some OCL examples IV — oclIsKindOf
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: age<18 implies self.fleet–>forAll(v | not v.oclIsKindOf(Car))
“A person younger than 18 owns no cars.”
– p.7
Some OCL examples IV — oclIsKindOf
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: age<18 implies self.fleet–>forAll(v | not v.oclIsKindOf(Car))
“A person younger than 18 owns no cars.”
– p.7
Some OCL examples IV — oclIsKindOf
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: age<18 implies self.fleet–>forAll(v | not v.oclIsKindOf(Car))
“A person younger than 18 owns no cars.”
Logical Junctors: and, or, not, implies, if. . . then. . . else. . . endif, =
– p.7
Some OCL examples V — allInstances
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Car
inv: Car.allInstances()->exists(c | c.colour=#red)
– p.8
Some OCL examples V — allInstances
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Car
inv: Car.allInstances()->exists(c | c.colour=#red)
“There is a red car.”
– p.8
OCL pre-/post conditions — Examples
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.9
OCL pre-/post conditions — Examples
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.9
OCL pre-/post conditions — Examples
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person::setAge(newAge:int)
pre: newAge >= 0
post: self.age = newAge
– p.9
OCL pre-/post conditions — Examples
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person::birthday()
post: self.age = self.age@pre + 1
– p.9
OCL pre-/post conditions — Examples
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person::getName()
post: result = name
– p.9
Queries
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
– p.10
Queries
Person
enumeration
name:String Colour
age:int owner ownership fleet Vehicle
query 1 0..*
colour:Colour black():Colour
getName():String white():Colour
birthday() red():Colour
setAge(newAge:int):int
Car Bike
context Person
inv: self.getName() = name
– p.10
OCL Basics
– p.11
OCL Basics
– p.11
OCL Basics
– p.11
OCL Basics
– p.11
OCL Basics
– p.11
OCL Basics (cont.)
– p.12
OCL Basics (cont.)
– p.12
OCL Basics (cont.)
– p.12
OCL in TogetherCC/KeY
– p.13
System state
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
context Person
inv: self.fleet–>forAll(v | v.colour = #black)
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
context Person
inv: self.fleet–>forAll(v | v.colour = #black) 4
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
context Person
inv: self.fleet–>forAll(v | v.colour = #black) 4
context Person
inv: self.fleet–>select(v | v.colour = #black)–>size <= 3
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
context Person
inv: self.fleet–>forAll(v | v.colour = #black) 4
context Person
inv: self.fleet–>select(v | v.colour = #black)–>size <= 3
– p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
context Person
inv: self.fleet–>forAll(v | v.colour = #black) 4
context Person
inv: self.fleet–>select(v | v.colour = #black)–>size <= 3
inv: Car.allInstances()–>exists(c | c.colour=#red) – p.14
System state
idBlack:Colour
id0815:Person
harley17:Bike
name = ‘‘Jane’’ black() = idBlack
colour = idBlack
age = 5 white() = idWhite
ownership red() = idRed
idWhite:Colour
id0825:Person ownership
bmw3:Car
name = ‘‘Paul’’ black() = idBlack
colour = idWhite
age = 25 white() = idWhite
red() = idRed
idRed:Colour
black() = idBlack
white() = idWhite
red() = idRed
context Vehicle
inv: self.owner.age >= 18
context Person
inv: self.fleet–>forAll(v | v.colour = #black) 4
context Person
inv: self.fleet–>select(v | v.colour = #black)–>size <= 3
inv: Car.allInstances()–>exists(c | c.colour=#red) 4 – p.14