+ All Categories
Home > Documents > 22c181: Formal Methods in Software Engineering

22c181: Formal Methods in Software Engineering

Date post: 18-Nov-2021
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
29
22c181: Formal Methods in Software Engineering The University of Iowa Spring 2008 From OCL to Typed First-order Logic Copyright 2007-8 Reiner Hähnle and Cesare Tinelli. Notes originally developed by Reiner Hähnle at Chalmers University and modified by Cesare Tinelli at the University of Iowa. These notes are copyrighted materials and may not be used in other course settings outside of the University of Iowa in their current form or modified form without the express written permission of one of the copyright holders. 22c181: Formal Methods in Software Engineering – p.1/15
Transcript
Page 1: 22c181: Formal Methods in Software Engineering

22c181:Formal Methods in Software Engineering

The University of Iowa

Spring 2008

From OCL to Typed First-order Logic

Copyright 2007-8 Reiner Hähnle and Cesare Tinelli.

Notes originally developed by Reiner Hähnle at Chalmers Uni versity and modified by Cesare Tinelli at the University of Io wa. These notes

are copyrighted materials and may not be used in other course settings outside of the University of Iowa in their current f orm or modified

form without the express written permission of one of the cop yright holders.

22c181: Formal Methods in Software Engineering – p.1/15

Page 2: 22c181: Formal Methods in Software Engineering

Contents

Overview of KeY

UML and its semantics

Introduction to OCL

Specifying requirements with OCL

Modelling of Systems with Formal Semantics

Propositional & First-order logic, sequent calculus

OCL to Logic, horizontal proof obligations, using KeY

Dynamic logic, proving program correctness

Java Card DL

Vertical proof obligations, using KeY

Wrap-up, trends

22c181: Formal Methods in Software Engineering – p.2/15

Page 3: 22c181: Formal Methods in Software Engineering

Formal Verification

Real

World

I

UMLOCLJava

Obj. Diagr.

Snapshot/LTS

Calculus

I

FO LogicDyn. Logic

FO Model

Kripke Str.

Translation

I , |=

FO LogicDyn. Logic

FO Model

Kripke Str.

SequentCalculus

22c181: Formal Methods in Software Engineering – p.3/15

Page 4: 22c181: Formal Methods in Software Engineering

OCL Context Declarations as Universal Quantifiers

Classifier Context (Invariants)

context typeName

inv ‘Boolean OclExpression-with- self ’

22c181: Formal Methods in Software Engineering – p.4/15

Page 5: 22c181: Formal Methods in Software Engineering

OCL Context Declarations as Universal Quantifiers

Classifier Context (Invariants)

context typeName

inv ‘Boolean OclExpression-with- self ’

Equivalent to universally quantified expression

inv typeName .allInstances() – > forAll (x | OclExpression-with- x)

22c181: Formal Methods in Software Engineering – p.4/15

Page 6: 22c181: Formal Methods in Software Engineering

OCL Context Declarations as Universal Quantifiers

Classifier Context (Invariants)

context typeName

inv ‘Boolean OclExpression-with- self ’

Equivalent to universally quantified expression

inv typeName .allInstances() – > forAll (x | OclExpression-with- x)

Example

context Personinv self.age >= 0

⇒inv Person.allInstances() – >

forAll(x | x.age >= 0)

22c181: Formal Methods in Software Engineering – p.4/15

Page 7: 22c181: Formal Methods in Software Engineering

Translating Universal Quantifiers from OCL to FOL

Universally quantified OCL expression

inv typeName .allInstances – > forAll (x | OclExpression-with- x)

22c181: Formal Methods in Software Engineering – p.5/15

Page 8: 22c181: Formal Methods in Software Engineering

Translating Universal Quantifiers from OCL to FOL

Universally quantified OCL expression

inv typeName .allInstances – > forAll (x | OclExpression-with- x)

Translation T to universal quantifier over variable x of type typeName

∀x.T (OclExpression-with- x)

22c181: Formal Methods in Software Engineering – p.5/15

Page 9: 22c181: Formal Methods in Software Engineering

Translating Universal Quantifiers from OCL to FOL

Universally quantified OCL expression

inv typeName .allInstances – > forAll (x | OclExpression-with- x)

Translation T to universal quantifier over variable x of type typeName

∀x.T (OclExpression-with- x)

Example

inv Person.allInstances() – >

forAll(x | x.age >= 0)T⇒ x : Person

∀x.(T (x.age >= 0))

22c181: Formal Methods in Software Engineering – p.5/15

Page 10: 22c181: Formal Methods in Software Engineering

Quantification over Existing Objects

If x is variable of type C from UML context,then ∀x.φ quantifies over all objects typeable with C

We want only the created objects in the current snapshot!

22c181: Formal Methods in Software Engineering – p.6/15

Page 11: 22c181: Formal Methods in Software Engineering

Quantification over Existing Objects

If x is variable of type C from UML context,then ∀x.φ quantifies over all objects typeable with C

We want only the created objects in the current snapshot!

Assume that each class C has Boolean attribute < created >

I(< created >)(o) is true iff o has been created in state described by I

22c181: Formal Methods in Software Engineering – p.6/15

Page 12: 22c181: Formal Methods in Software Engineering

Quantification over Existing Objects

If x is variable of type C from UML context,then ∀x.φ quantifies over all objects typeable with C

We want only the created objects in the current snapshot!

Assume that each class C has Boolean attribute < created >

I(< created >)(o) is true iff o has been created in state described by I

Instead of ∀ use quantifier ∀̇ defined as:

∀̇x.φ <-> ∀x.(x.< created > ->φ)

Instead of ∃ use quantifier ∃̇ defined as:

∃̇x.φ <-> ∃x.(x.< created >& φ)

22c181: Formal Methods in Software Engineering – p.6/15

Page 13: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Attributes

Attributes

class namePerson

name:String

e-mail:String

name compartment

attribute compartment

attribute names attribute types

OCL constraint with attribute

x.age >= 0

22c181: Formal Methods in Software Engineering – p.7/15

Page 14: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Attributes

Attributes

class namePerson

name:String

e-mail:String

name compartment

attribute compartment

attribute names attribute types

OCL constraint with attribute

x.age >= 0

UML attribute semantics

I(age) function from I(Person) to I(int)

22c181: Formal Methods in Software Engineering – p.7/15

Page 15: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Attributes

Attributes

class namePerson

name:String

e-mail:String

name compartment

attribute compartment

attribute names attribute types

OCL constraint with attribute

x.age >= 0

UML attribute semantics

I(age) function from I(Person) to I(int)

FOL type hierarchy & signature (fragment)

T = {Person, . . . ,int, . . .}

FSym = {age} with age : Person → int

PSym = {>=,<=,>,<, . . .}

22c181: Formal Methods in Software Engineering – p.7/15

Page 16: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Attributes

Attributes

class namePerson

name:String

e-mail:String

name compartment

attribute compartment

attribute names attribute types

OCL constraint with attribute

x.age >= 0

UML attribute semantics

I(age) function from I(Person) to I(int)

FOL type hierarchy & signature (fragment)

T = {Person, . . . ,int, . . .}

FSym = {age} with age : Person → int

PSym = {>=,<=,>,<, . . .}

FOL translation

T (x.age >= 0) = age(x)>=0

22c181: Formal Methods in Software Engineering – p.7/15

Page 17: 22c181: Formal Methods in Software Engineering

Notational Conventions

Allow postfix-dot notation for functions that model attribu tes

Example

age(x)>=0T⇒ x.age>=0

In simple cases FOL translation looks exactly like OCL :

OCL expressions w/o iterators are alternative concrete syntax of FOL

22c181: Formal Methods in Software Engineering – p.8/15

Page 18: 22c181: Formal Methods in Software Engineering

Notational Conventions

Allow postfix-dot notation for functions that model attribu tes

Example

age(x)>=0T⇒ x.age>=0

In simple cases FOL translation looks exactly like OCL :

OCL expressions w/o iterators are alternative concrete syntax of FOL

No generic types in Java Card and FOL (such as Set(Person))

Translation generates suitable flat types on-the-fly

SetOfPerson, SequenceOfPerson, etc.

Shorthand for sets of objects: Vehicle{}, Person{}, int{}

22c181: Formal Methods in Software Engineering – p.8/15

Page 19: 22c181: Formal Methods in Software Engineering

Assorted Remarks

FOL translation of OCL attribute interpreted as total funct ion

Value of an attribute might be null

Symbols with fixed interpretation for many OCL properties

<=, size, includes, +, 17, self, result, etc.

Correct intended semantics guaranteed by sound calculus ru les(automatically loaded)

If owner type of functions that model attributes and operati onsis required to resolve overloading, then write it in front :

Person ::age(x), Person{} ::includes(siblings(self),p)

22c181: Formal Methods in Software Engineering – p.9/15

Page 20: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Associations

Associations

Person

name:String

age:int

≪query≫getName():String

setAge(newAge:int):int

a

1

mother

1

father

a

Multiplicity 1: like attributes, but no dot notation

Function 〈supplier-role-name 〉 : 〈client-type 〉 → 〈supplier-type 〉

Example: father : Person → Person

Use explicit role name if present, otherwise default role na me

not(self.father = self.mother)T⇒ !(father(self)

.= mother(self))

22c181: Formal Methods in Software Engineering – p.10/15

Page 21: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Associations

Associations

Person

name:String

age:int

≪query≫getName():String

setAge(newAge:int):int

a

*siblings

*nephews

a

Other multiplicity than 1:

Function 〈supplier-role-name 〉 : 〈client-type 〉 → 〈Supplier-type {}〉

22c181: Formal Methods in Software Engineering – p.11/15

Page 22: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Associations

Associations

Person

name:String

age:int

≪query≫getName():String

setAge(newAge:int):int

a

*siblings

*nephews

a

Other multiplicity than 1:

Function 〈supplier-role-name 〉 : 〈client-type 〉 → 〈Supplier-type {}〉

Example: siblings : Person → Person{}

self.siblings = self.nephewsT⇒ siblings(self)

.= nephews(self)

Problem: no rules for equality of sets of objects ⇒ extensionality

22c181: Formal Methods in Software Engineering – p.11/15

Page 23: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Associations

Associations

Person

name:String

age:int

≪query≫getName():String

setAge(newAge:int):int

a

*siblings

*nephews

a

Other multiplicity than 1:

Function 〈supplier-role-name 〉 : 〈client-type 〉 → 〈Supplier-type {}〉

siblings(self).= nephews(self) expanded into:

∀̇p.( Person{}::includes(siblings(self), p)

<->

Person{}::includes(nephews(self), p))

22c181: Formal Methods in Software Engineering – p.11/15

Page 24: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: allInstances()

allInstances()

Person

name:String

age:int

≪query≫getName():String

setAge(newAge:int):int

a

1

mother

1

father

a

Argument of OCL quantifier forAll, exists

Analogous treatment to class context declaration

ExamplePerson.allInstances() -> forAll(age >= 0)

T⇒

∀̇x.(x.age>=0)

22c181: Formal Methods in Software Engineering – p.12/15

Page 25: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: allInstances()

allInstances()

Person

name:String

age:int

≪query≫getName():String

setAge(newAge:int):int

a

1

mother

1

father

a

Other collection property than quantifier

For T.allInstances() create constant T{}::allInstances :→ T{}

Add “definition” of T{}::allInstances to goal antecedent:

∀̇x. T{}::includes(T{}::allInstances, x)

Example for translation of allInstances()Person.allInstances() -> size() = 1

T⇒

Person{}::size(Person{}::allInstances).= 1

22c181: Formal Methods in Software Engineering – p.13/15

Page 26: 22c181: Formal Methods in Software Engineering

Translating OCL to FOL: Important Issues

In many cases FOL translation follows OCL closely

Some collection properties have complicated translations(select, reject)

Translator optimizes whenever possible

Sometimes, translation declares new function symbols

Definitions placed in antecedent (ie, left) of sequent arrow ==>

Details of translation (see also course web page):

B. Beckert, U. Keller, P Schmitt:Translating the OCL into First-order Predicate Logic

A. Roth & P. SchmittFormal Specification , Section 5.2.3

22c181: Formal Methods in Software Engineering – p.14/15

Page 27: 22c181: Formal Methods in Software Engineering

Horizontal Verification: Behavioural Subtyping

Substitution principle (Liskov, 1993)

Let φ be a property provable about objects x of type T .Then φ should be true for objects y of type S where S⊑T .

22c181: Formal Methods in Software Engineering – p.15/15

Page 28: 22c181: Formal Methods in Software Engineering

Horizontal Verification: Behavioural Subtyping

Substitution principle (Liskov, 1993)

Let φ be a property provable about objects x of type T .Then φ should be true for objects y of type S where S⊑T .

Consequence is invariant subtyping property:

Invariant of a class must imply invariant of all parent class es

22c181: Formal Methods in Software Engineering – p.15/15

Page 29: 22c181: Formal Methods in Software Engineering

Horizontal Verification: Behavioural Subtyping

Substitution principle (Liskov, 1993)

Let φ be a property provable about objects x of type T .Then φ should be true for objects y of type S where S⊑T .

Consequence is invariant subtyping property:

Invariant of a class must imply invariant of all parent class es

invS is (FOL translation of) OCL invariant constraint of a class S

T1, . . . , Tn parent classes and interfaces of S

Proof obligation: ∀̇self.(invS -> (invT1& · · ·&invTn

))

22c181: Formal Methods in Software Engineering – p.15/15


Recommended