1
|
\documentclass[11pt]{scrartcl}
|
2
|
|
3
|
\usepackage{cancel}
|
4
|
\usepackage{listings}
|
5
|
\usepackage{xspace}
|
6
|
\usepackage{longtable}
|
7
|
\usepackage{graphicx}
|
8
|
\usepackage{url}
|
9
|
|
10
|
|
11
|
\newcommand{\doodblock}{{\bf do} {\bf od}-block \xspace}
|
12
|
\newcommand{\doodblocks}{{\bf do} {\bf od}-blocks \xspace}
|
13
|
|
14
|
|
15
|
\lstdefinelanguage{ooa} {
|
16
|
morekeywords={autocons, types, methods, do, obs, action, end, ctr, requires, od, true, and,
|
17
|
signal, after, false, actions, var, |[, ]|, [], public, of, len,
|
18
|
//, hd, tl, system},
|
19
|
sensitive=true,
|
20
|
morecomment=[s]{/*}{*/},
|
21
|
showspaces=false,
|
22
|
showstringspaces=false,
|
23
|
numbers=left,
|
24
|
numbersep=5pt,
|
25
|
numberstyle=\tiny,
|
26
|
tabsize=2,
|
27
|
escapeinside={@}{@},
|
28
|
framexleftmargin=9pt,
|
29
|
}
|
30
|
|
31
|
|
32
|
\begin{document}
|
33
|
|
34
|
|
35
|
|
36
|
|
37
|
|
38
|
|
39
|
\begin{titlepage}
|
40
|
\begin{center}
|
41
|
|
42
|
\vspace*{15mm}
|
43
|
|
44
|
{\Large TECHNICAL REPORT}
|
45
|
|
46
|
\vspace{10mm}
|
47
|
|
48
|
{\large IST-MBT-2012-01}
|
49
|
|
50
|
\vspace{15mm}
|
51
|
|
52
|
{\huge \bf The Argos Manual}
|
53
|
|
54
|
\vspace{5mm}
|
55
|
|
56
|
{\Large for Argos version: 0.39}
|
57
|
|
58
|
\vspace{15mm}
|
59
|
|
60
|
{\Large Stefan Tiran}
|
61
|
|
62
|
\vspace{5mm}
|
63
|
|
64
|
{\large stiran@ist.tugraz.at}
|
65
|
|
66
|
\vspace{15mm}
|
67
|
|
68
|
{\large March 2012} % 13.03.2012
|
69
|
|
70
|
\vspace{10mm}
|
71
|
|
72
|
{\large
|
73
|
Institute for Software Technology (IST)\\
|
74
|
Graz University of Technology\\
|
75
|
A-8010 Graz, Austria\\}
|
76
|
|
77
|
\end{center}
|
78
|
\end{titlepage}
|
79
|
|
80
|
|
81
|
|
82
|
|
83
|
|
84
|
%\title{The Argos Manual}
|
85
|
|
86
|
%\author{Stefan Tiran}
|
87
|
|
88
|
%\subtitle{for Argos version: 0.39}
|
89
|
|
90
|
%\maketitle
|
91
|
\newpage
|
92
|
\tableofcontents
|
93
|
\listoffigures
|
94
|
|
95
|
|
96
|
\section{Introduction}
|
97
|
|
98
|
Argos is a compiler for Object-Oriented Action Systems (OOAS). It has been developed
|
99
|
by Willibald Krenn from Graz University of Technology within the MOGENTES project.
|
100
|
|
101
|
Its main target is producing Action Systems in the proprietary format that \emph{Ulysses}
|
102
|
can process. \emph{Ulysses} is an ioco-checker written by Harald Brandl also within the
|
103
|
MOGENTES project.
|
104
|
|
105
|
\section{How To Run Argos}
|
106
|
|
107
|
Argos is a .NET based command line program. To run it you need either
|
108
|
the .NET Framework or mono (\url{http://www.mono-project.com}).
|
109
|
|
110
|
\subsection{Program Invocation}
|
111
|
|
112
|
Since Argos is a command line tool you need to open a command line prompt
|
113
|
(using Windows) resp. a shell (using a UNIX-like system).
|
114
|
|
115
|
When using Windows change to the Argos directory and simply run argos.exe:
|
116
|
|
117
|
\texttt{
|
118
|
c:\textbackslash Argos \textbackslash > argos}
|
119
|
|
120
|
When using a UNIX-like system run mono with argos.exe as parameter:
|
121
|
|
122
|
\texttt{
|
123
|
\$ mono argos.exe}
|
124
|
|
125
|
In both cases one should now see this welcome screen:
|
126
|
|
127
|
\begin{verbatim}
|
128
|
>> Mogentes OO-Action System Parser <<
|
129
|
|
130
|
Version: 0.39 (16471)
|
131
|
Grammar-Version: 0.06
|
132
|
|
133
|
Usage: argos [options] <oo-actionsystem-file>
|
134
|
Options:
|
135
|
-o<name> ... write output to file <name> (overwrites!)
|
136
|
-n<name> ... use namespace <name> (default: as)
|
137
|
-d<depth> ... set max. search depth (default: 35)
|
138
|
-q ... "quiet" mode: doesn't print Warnings to console
|
139
|
|
140
|
-a ... create pseudo-action system code
|
141
|
-p ... create prolog code
|
142
|
-c ... create CADP implicit LTS
|
143
|
|
144
|
\end{verbatim}
|
145
|
|
146
|
\subsection{Options and Arguments}
|
147
|
|
148
|
As can be seen in the welcome screen for translating Action Systems the
|
149
|
last parameter has to be the OOAS-File you want to convert, every other
|
150
|
options has to come before.
|
151
|
|
152
|
If no other option is given, Argos will translate the given OOAS-File to
|
153
|
C\#-Pseudo-Code and print it out on the screen. Since this most probably
|
154
|
won't be something you will find extremely useful, you should at least
|
155
|
specify an output-file and the desired language.
|
156
|
|
157
|
For specifying the output-file use option \texttt{-o} followed by the
|
158
|
file name resp. the relative path of the file you want to create. There
|
159
|
should be NO space between \texttt{-o} and the file name!
|
160
|
|
161
|
For specifying the language include option \texttt{-c} for creating
|
162
|
C-Code for the CADP-Toolbox resp. option \texttt{-p} for creating
|
163
|
Prolog-Code for use with the Ulysses tool.
|
164
|
|
165
|
When creating Prolog-Code the following options are important:
|
166
|
\begin{itemize}
|
167
|
\item[-n] With this option one can specify the namespace within the Prolog-File;
|
168
|
the only meaningful use of this option is \texttt{-nasm} for letting
|
169
|
the Ulysses tool know, that this file represents the mutant rather
|
170
|
then the original file.
|
171
|
\item[-d] With this option one can specify the max. depth, to which the Ulysses
|
172
|
tool will search for differences. Please note that this option has
|
173
|
to be followed by a number WITHOUT a space before! The default value
|
174
|
is 35, so leaving out this option is equivalent to writing
|
175
|
\texttt{-d35}.
|
176
|
|
177
|
\subsection{Examples}
|
178
|
|
179
|
To illustrate the use of the options, we hereby provide the following examples:
|
180
|
|
181
|
\begin{itemize}
|
182
|
\item Translate an original OOAS specification \texttt{original.ooas} to a Prolog
|
183
|
file \texttt{original.pl} for the Ulysses tool with max. search depth
|
184
|
42:
|
185
|
\begin{verbatim} argos.exe -p -d42 -ooriginal.pl original.ooas \end{verbatim}
|
186
|
\item Translate a mutated OOAS specification \texttt{mutant.ooas} to a Prolog
|
187
|
file \texttt{mutant.pl} for the Ulysses tool with max. search depth
|
188
|
42:
|
189
|
\begin{verbatim} argos.exe -p -d42 -nasm -omutant.pl mutant.ooas \end{verbatim}
|
190
|
\item Translate OOAS specification \texttt{original.ooas} to a C file
|
191
|
\texttt{original.c} for the use with the CADP toolbox:
|
192
|
\begin{verbatim} argos.exe -c -ooriginal.c original.ooas \end{verbatim}
|
193
|
|
194
|
|
195
|
\end{itemize}
|
196
|
|
197
|
\end{itemize}
|
198
|
|
199
|
\section{OOAS Language}
|
200
|
|
201
|
The Argos tool will only work if the given file is well formed according
|
202
|
to the language that is described in this section. The language is based
|
203
|
on the language proposed in \cite{Bonsangue1998} but only a subset of features
|
204
|
is actually implemented.
|
205
|
|
206
|
\subsection{Base structure}
|
207
|
|
208
|
To illustrate the base structure of an OOAS file let us consider the simple
|
209
|
Hello World program in Figure \ref{HelloWorld}.
|
210
|
|
211
|
\begin{figure}[h]
|
212
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
213
|
types
|
214
|
Greeter = autocons system
|
215
|
|[
|
216
|
var
|
217
|
done : bool = false
|
218
|
actions
|
219
|
obs HelloWorld = requires done = false :
|
220
|
done := true
|
221
|
end
|
222
|
do
|
223
|
HelloWorld
|
224
|
od
|
225
|
]|
|
226
|
system
|
227
|
Greeter
|
228
|
|
229
|
\end{lstlisting}
|
230
|
\caption{HelloWorld}
|
231
|
\label{HelloWorld}
|
232
|
\end{figure}
|
233
|
|
234
|
Every OOAS consists of two different regions: The type definition block and
|
235
|
the system assembling block. In the HelloWorld system the type definition block
|
236
|
consists of Lines 1 - 13 and the system assembling consists of Lines 14 and 15.
|
237
|
|
238
|
Let us now discuss the system Line by Line:
|
239
|
Line 1 just consists of the keyword \texttt{types} stating that here begins
|
240
|
the type definition block.
|
241
|
In Line 2 a class called \texttt{Greeter} is defined. The keyword
|
242
|
\texttt{autocons} states that one instance of the class will automatically
|
243
|
be created at system start. This instance is called the ``root object''.
|
244
|
The symbols in Line 3 and 13 state the begin and the end of the class
|
245
|
definition.
|
246
|
In Lines 4 and 5 there is a variable definition
|
247
|
block. Even though this block is not formally necessary for Argos to compile
|
248
|
a file, Argos will not create a valid prolog file if this block is missing.
|
249
|
In Lines 6 - 9 there is the action block consisting of the action
|
250
|
\texttt{HelloWorld}. The keyword \texttt{obs} states that this action is
|
251
|
\emph{observable} rather then \emph{controllable} (keyword: \texttt{ctr}) or
|
252
|
internal (no keyword).
|
253
|
The keyword \texttt{requires} states the beginning of the guard, which enables
|
254
|
the action.
|
255
|
The body of this action consists of Lines 8 and 9. Line 8 contains an
|
256
|
assignment, the keyword \texttt{end} in Line 9 marks the end of the action.
|
257
|
Lines 10 - 12 contains the so-called \doodblock. The \doodblock is
|
258
|
described in Section \ref{dood}.
|
259
|
|
260
|
As already mentioned, Lines 14 + 15 contain the system assembling block. In this
|
261
|
block the system is composed of its classes. Since this example system only
|
262
|
contains of one class, the block is quite simple and needs no further
|
263
|
explanation.
|
264
|
|
265
|
\subsection{The Type Definition Block}
|
266
|
|
267
|
The type definition block has two purposes: As we have already seen it can be
|
268
|
used for defining the classes of which the system consists of. However it
|
269
|
can also be used for creating named types which is similar to the use of
|
270
|
\texttt{type-def} in C.
|
271
|
|
272
|
The latter use is quite important as OOAS has a very strict typing system.
|
273
|
For example if you want to define a variable as integer, you also have to
|
274
|
define the range of the values. This is due to the fact that too wide ranges
|
275
|
can lead to enormous efficiency problems when simulating the model.
|
276
|
|
277
|
\subsubsection{Defining Integer Types}
|
278
|
|
279
|
Integer types can be defined by the lower and upper range.
|
280
|
|
281
|
Consider you want to define a type \texttt{MyInt} that can contain values
|
282
|
between 0 and 31, then you can write
|
283
|
\begin{verbatim}
|
284
|
MyInt = int [0..31];
|
285
|
\end{verbatim}
|
286
|
|
287
|
Please note that the semicolon has to be placed if and only if this is not
|
288
|
the last definition.
|
289
|
|
290
|
\subsubsection{Defining Enum Types}
|
291
|
|
292
|
Enums can be defined by enumerating the possible values and optionally assigning them
|
293
|
integer values. If integer values are explicitly assigned, enum types can be casted to
|
294
|
integer types.
|
295
|
|
296
|
Consider you want to define an enum type \texttt{Color} that can contain the
|
297
|
values \texttt{red}, \texttt{green}, \texttt{blue}, \texttt{yellow} and \texttt{black},
|
298
|
then you can write:
|
299
|
\begin{verbatim}
|
300
|
Color = {red, green, blue, yellow, black};
|
301
|
\end{verbatim}
|
302
|
|
303
|
The possibility to explicitly assign integer values is especially useful when
|
304
|
dealing with equivalent classes of integers. Consider you need an integer type
|
305
|
that can only contain small number of different values but these values define
|
306
|
a range with "holes" rather then a complete one.
|
307
|
|
308
|
So in case you need a type that can hold the values 1, 42 and 1337 you can write
|
309
|
\begin{verbatim}
|
310
|
CoolValueSet = {CoolValue1 = 1, CoolValue2 = 42, CoolValue3 = 1337};
|
311
|
\end{verbatim}
|
312
|
|
313
|
\subsubsection{Defining Complex Types (Lists, Tuples)}
|
314
|
|
315
|
Additional to the former so-called simple types the OOAS language also
|
316
|
supports so-called complex types. These are: lists and tuples.
|
317
|
|
318
|
A list is defined by the number and the type of its elements.
|
319
|
|
320
|
An example for the former variant would be:
|
321
|
\begin{verbatim}
|
322
|
MyList = list [42] of char;
|
323
|
\end{verbatim}
|
324
|
|
325
|
A tuple is defined by the types of its elements. Unlike a list the types can
|
326
|
differ among the different elements.
|
327
|
|
328
|
An example would be:
|
329
|
\begin{verbatim}
|
330
|
MyTuple = (MyInt, SmallInt);
|
331
|
\end{verbatim}
|
332
|
|
333
|
Even though maps and qualitative reasoning types would be specified by the
|
334
|
OOAS language, Argos does not support them yet.
|
335
|
|
336
|
\subsubsection{Defining Classes}
|
337
|
|
338
|
In the OOAS language the definition of a class (ooActionSystem) does not differ
|
339
|
from the definition of any other type.
|
340
|
|
341
|
\subsection{Structure of Classes}
|
342
|
|
343
|
\subsubsection{Inheritance}
|
344
|
|
345
|
As common in Object-Oriented languages, classes can be derived from other classes
|
346
|
and inherit their behavior.
|
347
|
A sample class \texttt{Desc} inheriting from a class \texttt{base} could look like this:
|
348
|
|
349
|
\begin{verbatim}
|
350
|
Desc = system (base)
|
351
|
|[
|
352
|
]|
|
353
|
|
354
|
\end{verbatim}
|
355
|
|
356
|
\subsubsection{Defining Variables (Attributes)}
|
357
|
\label{Variables}
|
358
|
|
359
|
Variables store the information of the state of an object. An alternative name
|
360
|
of variables often used in error messages is ``attributes''. Variables can be
|
361
|
static and have to be initialized with a valid value. For objects there is a
|
362
|
predefined object \texttt{nil}. There is also a self-reference called
|
363
|
\texttt{self}.
|
364
|
|
365
|
The definition of a variable can look like this:
|
366
|
\begin{verbatim}
|
367
|
done : bool = false;
|
368
|
\end{verbatim}
|
369
|
|
370
|
Please note that the semicolon has to be placed if and only if this is not
|
371
|
the last definition.
|
372
|
|
373
|
\subsubsection{Creating Objects}
|
374
|
|
375
|
The only place where an object can be created is in the variable definition block.
|
376
|
Line 5 in Figure \ref{object} demonstrates how a variable with the name
|
377
|
\texttt{myOtherClassObject} can be initialized with an object with the name
|
378
|
\texttt{OtherClassObject} of a class \texttt{OtherClass}.
|
379
|
|
380
|
For details on the System Assembling Block (Lines 23 and 24) see Section
|
381
|
\ref{SAB}.
|
382
|
|
383
|
\begin{figure}[h]
|
384
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
385
|
types
|
386
|
RootClass = autocons system
|
387
|
|[
|
388
|
var
|
389
|
myOtherClassObject : OtherClass = new(OtherClass,"OtherClassObject") ;
|
390
|
initialized : bool = false
|
391
|
actions
|
392
|
obs init = requires initialized = false : initialized := true end
|
393
|
do
|
394
|
init ()
|
395
|
od
|
396
|
]| ;
|
397
|
OtherClass = system
|
398
|
|[
|
399
|
var
|
400
|
initialized : bool = false
|
401
|
actions
|
402
|
obs init = requires initialized = false : initialized := true end
|
403
|
do
|
404
|
init ()
|
405
|
od
|
406
|
]|
|
407
|
system
|
408
|
RootClass [] OtherClass
|
409
|
\end{lstlisting}
|
410
|
\caption{Creating an object}
|
411
|
\label{object}
|
412
|
\end{figure}
|
413
|
|
414
|
\subsubsection{Defining Methods}
|
415
|
|
416
|
Methods can be used for defining subroutines. Methods can have parameters,
|
417
|
variables and a return value. Methods can be called from actions and
|
418
|
from other methods, but not recursively - neither directly nor indirectly.
|
419
|
|
420
|
The body of a method isn't any different from the body of an action
|
421
|
and therefore described in Section \ref{Actions}.
|
422
|
|
423
|
A sample method, that returns the bigger of two values could look like this:
|
424
|
|
425
|
\begin{verbatim}
|
426
|
maxValue(a : MyInt, b : MyInt) : MyInt =
|
427
|
result := if (a > b) then a else b end
|
428
|
end;
|
429
|
\end{verbatim}
|
430
|
|
431
|
Returning a value is done by assigning it to the variable result.
|
432
|
For a list of possible expressions we refer to Section \ref{Expressions}.
|
433
|
|
434
|
One important aspect of methods is their pureness. A method is pure
|
435
|
iff there is no assignment to a variable other than \texttt{result}.
|
436
|
This property is checked on compile
|
437
|
time. Only if a method is pure it can be used in a guard or in a list
|
438
|
comprehension.
|
439
|
|
440
|
\subsubsection{Defining Actions}
|
441
|
\label{Actions}
|
442
|
|
443
|
Named actions consist of an optional parameter list, a variable definition
|
444
|
block and a body but they lack a return value. Named actions can only be
|
445
|
called in the so-called \doodblock.
|
446
|
|
447
|
A named action can be controllable (keyword \texttt{ctr}),
|
448
|
observable (keyword \texttt{obs}) or internal (no keyword).
|
449
|
|
450
|
The definition of local variables does not differ from any
|
451
|
other variable definition so we refer to Section \ref{Variables}.
|
452
|
|
453
|
The body of a named action can consist of one or more basic actions.
|
454
|
Every action has a guard which ``enables'' it. The general form of a guard
|
455
|
is \texttt{requires p : $S_1$ end} where p is the condition
|
456
|
and $S_1$ is the action. The condition can be any expression that doesn't
|
457
|
involve the calling of a non-pure method or a non-pure assignment.
|
458
|
|
459
|
For further details about expressions see Section \ref{Expressions}!
|
460
|
|
461
|
Basic actions can be the built-in action \texttt{skip},
|
462
|
single or multiple assignment or a sequential composition of two other actions.
|
463
|
For details on the composition we refer to Section \ref{Composition}.
|
464
|
|
465
|
The built-in action \texttt{skip} doesn't do anything at all.
|
466
|
Sometimes this is called \emph{identity assignment}.
|
467
|
|
468
|
Single assignment has the simple form \texttt{v := e} where
|
469
|
v is a variable and e is an expression.
|
470
|
|
471
|
However you can also assign multiple expressions to multiple
|
472
|
variables by separating them with commas.
|
473
|
|
474
|
So if \texttt{done} and \texttt{multi} are both variables of
|
475
|
type \texttt{bool}, then you can write:
|
476
|
|
477
|
\begin{verbatim}
|
478
|
done, multi := true, true
|
479
|
\end{verbatim}
|
480
|
|
481
|
\subsection{Composition}
|
482
|
\label{Composition}
|
483
|
\subsubsection{Sequential Composition}
|
484
|
|
485
|
The easiest way of composing two actions is the sequential
|
486
|
composition. It has the general form \texttt{A ; B} where
|
487
|
A and B are both actions and has the meaning that iff
|
488
|
A and B are \emph{enabled}, first action A is executed and then
|
489
|
action B is executed. Note that it is not necessary for B
|
490
|
to be enabled before A. It is also possible that B becomes
|
491
|
enabled because of A.
|
492
|
|
493
|
Please note that despite of the
|
494
|
apparent resemblance with the semicolon as marker of the
|
495
|
end of a line in many imperative programming languages
|
496
|
there are two very important differences:
|
497
|
|
498
|
The first difference is that since it is a composition operator,
|
499
|
there must not be a semicolon after the last action. This
|
500
|
difference seems to be more on a syntactical level, but should
|
501
|
also warn about the other very important difference:
|
502
|
|
503
|
The second difference is that since actions have guards, no
|
504
|
action of a sequence block is executed, if a single action is
|
505
|
not enabled. This also means that an action can hinder actions
|
506
|
to be executed, which were called \emph{before}!
|
507
|
|
508
|
\subsubsection{Non-deterministic Choice}
|
509
|
|
510
|
The counterpart of the ``sequential composition'' is the so
|
511
|
called ``non-deterministic choice''.
|
512
|
|
513
|
The general form of a non-deterministic choice is \texttt{ A [] B }
|
514
|
where A and B are both actions and the meaning is that either
|
515
|
A or B is executed. However an action can only be chosen if it
|
516
|
is enabled. According to the theory of action systems an action has to be
|
517
|
chosen if it is aborting. However there is no abort feature implemented yet.
|
518
|
|
519
|
\subsubsection{Prioritizing Composition}
|
520
|
|
521
|
The ``prioritizing composition'' is rather an abbreviation
|
522
|
than an actual new type of composition.
|
523
|
|
524
|
The general form is \texttt{ A // B } and it means that if A
|
525
|
is enabled, it is chosen and otherwise B is chosen.
|
526
|
|
527
|
\subsection{Expressions}
|
528
|
\label{Expressions}
|
529
|
|
530
|
Expressions can be evaluated and their values can be assigned to variables.
|
531
|
|
532
|
\subsubsection{Conditional Assignment}
|
533
|
|
534
|
Conditional Assignments are expressions. They can not be used for branching
|
535
|
the control sequence. Branching the control sequence has to be done by using
|
536
|
guards and non-deterministic choice.
|
537
|
|
538
|
A conditional assignment can look like this:
|
539
|
\begin{verbatim}
|
540
|
c := if (a > b) then a else b end
|
541
|
\end{verbatim}
|
542
|
|
543
|
\subsubsection{Fold}
|
544
|
|
545
|
For the purpose of iterating through a list in OOAS \emph{fold} is used.
|
546
|
\emph{Fold} is a higher-order function well known from the functional
|
547
|
programming paradigm.
|
548
|
|
549
|
In the OOAS language both \emph{right fold} and \emph{left fold} are
|
550
|
defined. The symbol for the former is \texttt{:>:} whereas the symbol
|
551
|
for the latter is \texttt{:<:}. However in Argos only \emph{right fold} is
|
552
|
implemented.
|
553
|
|
554
|
The general form of a fold expression is \texttt{method :: (init\_expression) :>: (list\_\\expression)}
|
555
|
where \texttt{method} is the name of the method, \texttt{init\_expression} is the value for the last
|
556
|
parameter of the method for the first call. For any other call the result of the former call is used instead.
|
557
|
Finally \texttt{list\_expression} is the expression that evaluates to the list to be iterated.
|
558
|
|
559
|
|
560
|
Figure \ref{Sum} shows how to define a method \texttt{Sum}
|
561
|
using a method \texttt{Add} and the \emph{fold} operator.
|
562
|
|
563
|
\begin{figure}[h]
|
564
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
565
|
types
|
566
|
MyInt = int [0..42];
|
567
|
SmallInt = int [0..3];
|
568
|
MyTuple = (MyInt, SmallInt);
|
569
|
Sum = autocons system
|
570
|
|[
|
571
|
var
|
572
|
my_list : list [4] of SmallInt = [5,5,5,5]
|
573
|
methods
|
574
|
add(a: MyInt, b: SmallInt) : MyInt =
|
575
|
requires true :
|
576
|
result := a + b
|
577
|
end
|
578
|
end ;
|
579
|
sum(Xs : list [4] of SmallInt) : MyInt =
|
580
|
requires true :
|
581
|
result := add :: (0) :>: (Xs)
|
582
|
end
|
583
|
end
|
584
|
actions
|
585
|
obs Sum(a: MyInt) =
|
586
|
requires a = sum(my_list) :
|
587
|
skip
|
588
|
end
|
589
|
do
|
590
|
var A : MyInt : Sum(A)
|
591
|
od
|
592
|
]|
|
593
|
system
|
594
|
Sum
|
595
|
\end{lstlisting}
|
596
|
\caption{Defining sum of all list elements using the fold meta function}
|
597
|
\label{Sum}
|
598
|
\end{figure}
|
599
|
|
600
|
\subsubsection{Quantifier Expressions}
|
601
|
|
602
|
The OOAS language allows to use the quantifiers \texttt{forall} and
|
603
|
\texttt{exists}. The resulting expressions will evaluate to Boolean
|
604
|
values. The general form is \texttt{(quantifier : Type : (logical sentence))}.
|
605
|
|
606
|
For example an existential quantification can look like this:
|
607
|
\texttt{(exists i : LengthInt : (primes[i] = a))}.
|
608
|
|
609
|
|
610
|
\subsubsection{List Comprehension}
|
611
|
|
612
|
The OOAS language allows to construct new list expressions based on existing lists
|
613
|
by using the set-builder notation. These expressions can be assigned to list
|
614
|
variables at any time after the initialization, but not in the declaration.
|
615
|
|
616
|
The general form of a list comprehension is:
|
617
|
|
618
|
\texttt{list := [x | var x : Type \& (condition)]}, where \texttt{Type} is the type
|
619
|
of the list elements and \texttt{condition} is a logical sentence which determines
|
620
|
whether a value should be inserted to the list.
|
621
|
|
622
|
The example in Figure \ref{Prime} illustrates both \emph{Quantifier Expressions}
|
623
|
and \emph{List Comprehension} by computing prime numbers.
|
624
|
|
625
|
\begin{figure}[h]
|
626
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
627
|
types
|
628
|
MyInt = int [2..100];
|
629
|
LengthInt = int [0..40];
|
630
|
Primes = autocons system
|
631
|
|[
|
632
|
var
|
633
|
initialized : bool = false ;
|
634
|
primes : list [ 40 ] of MyInt = [3]
|
635
|
actions
|
636
|
obs init = requires initialized = false :
|
637
|
primes := [ x | var x: MyInt & (forall tmp : MyInt :
|
638
|
(tmp < x => (x mod tmp <> 0 ))) ] ;
|
639
|
initialized := true end;
|
640
|
|
641
|
obs Prime(a: MyInt) =
|
642
|
requires (exists i : LengthInt : (primes[i] = a)) :
|
643
|
skip
|
644
|
end
|
645
|
|
646
|
do
|
647
|
init() // var A : MyInt : Prime(A)
|
648
|
od
|
649
|
]|
|
650
|
system
|
651
|
Primes
|
652
|
\end{lstlisting}
|
653
|
\caption{Prime number calculation}
|
654
|
\label{Prime}
|
655
|
\end{figure}
|
656
|
|
657
|
\subsubsection{Tuple Expressions}
|
658
|
|
659
|
The general form of an expression that evaluates to a tuple is:
|
660
|
\begin{verbatim}
|
661
|
TupleType(v_1,...,v_n)
|
662
|
\end{verbatim}
|
663
|
where TupleType is the type of the tuple and v\_1,...,v\_n are the values.
|
664
|
|
665
|
An example for using Tuples can be found in Figure \ref{Tuple}
|
666
|
\begin{figure}[h]
|
667
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
668
|
types
|
669
|
MyInt = int [0..42] ;
|
670
|
MyTuple = (MyInt, MyInt) ;
|
671
|
TupleDemo = autocons system
|
672
|
|[
|
673
|
var
|
674
|
theTuple : MyTuple = MyTuple(1,1)
|
675
|
actions
|
676
|
ctr change1 = requires theTuple = MyTuple(1,1) :
|
677
|
theTuple := MyTuple(1,2)
|
678
|
end ;
|
679
|
ctr change2 = requires theTuple[1] = 2 :
|
680
|
theTuple := MyTuple(1,3)
|
681
|
end
|
682
|
do
|
683
|
change1 [] change2
|
684
|
od
|
685
|
]|
|
686
|
system
|
687
|
TupleDemo
|
688
|
|
689
|
\end{lstlisting}
|
690
|
\caption{Tuple Example}
|
691
|
\label{Tuple}
|
692
|
\end{figure}
|
693
|
|
694
|
|
695
|
\subsubsection{Access Expressions}
|
696
|
|
697
|
\emph{Access Expression} is the general term for the access of elements
|
698
|
in a list or tuple, call of method or access to an attribute of an object.
|
699
|
|
700
|
Accessing elements of a list is done by using the index operator \texttt{[]}
|
701
|
well known from accessing arrays in imperative languages like C.
|
702
|
The index starts with 0.
|
703
|
|
704
|
The index operator \texttt{[]} can also be used to access a specific element of
|
705
|
a tuple. This feature is illustrated in the guard of action \texttt{change2} in
|
706
|
Figure \ref{Tuple}. However this feature is not implemented in the left hand
|
707
|
side of an assignment, e. g. it is not possible to write \texttt{theTuple[0] := 1}.
|
708
|
|
709
|
\subsubsection{Cast Expressions}
|
710
|
|
711
|
When dealing with a class hierarchy it is possibly to use an object of a
|
712
|
sub class instead of an object of its super class. This is called \emph{upcast}
|
713
|
and done implicitly in most contexts. However, when concatenating two
|
714
|
lists it has to be done explicitly using the operator \texttt{as} as illustrated
|
715
|
in Line 10 in Figure \ref{Cast}.
|
716
|
|
717
|
\begin{figure}[h]
|
718
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
719
|
types
|
720
|
Class1 = autocons system
|
721
|
|[
|
722
|
var
|
723
|
O2 : Class2 = new (Class2);
|
724
|
O3 : Class3 = new (Class3);
|
725
|
OL : list[2] of Class2 = [nil]
|
726
|
actions
|
727
|
ctr fill = requires true :
|
728
|
OL := [O2]^[O3 as Class2]
|
729
|
end
|
730
|
do
|
731
|
fill
|
732
|
od
|
733
|
]| ;
|
734
|
Class2 = system
|
735
|
|[
|
736
|
]| ;
|
737
|
Class3 = system (Class2)
|
738
|
|[
|
739
|
]|
|
740
|
system
|
741
|
Class1
|
742
|
\end{lstlisting}
|
743
|
\caption{Cast Example}
|
744
|
\label{Cast}
|
745
|
\end{figure}
|
746
|
|
747
|
|
748
|
\subsection{Operators}
|
749
|
|
750
|
\subsubsection{Numeric Operators}
|
751
|
|
752
|
The numeric operators are \texttt{+} for adding two numbers of an integer or
|
753
|
float type, \texttt{-} for subtracting, \texttt{*} for multiplying. The operator
|
754
|
for the division of two numbers of a float type is \texttt{/}. For the division
|
755
|
of two numbers of an integer type there are operators \texttt{div} for the
|
756
|
quotient and \texttt{mod} for the remainder.
|
757
|
|
758
|
\subsubsection{Logical Operators}
|
759
|
|
760
|
The logical operators are inspired by VDM and written \texttt{and} for logical
|
761
|
and, \texttt{or} for logical or, \texttt{not} for negation, \texttt{=>} for
|
762
|
implication, and \texttt{<=>} for bi-implication.
|
763
|
|
764
|
\subsubsection{Comparison Operators}
|
765
|
|
766
|
For comparing two values of the same type there are \texttt{=} for equality
|
767
|
|
768
|
and \texttt{<>} for inequality.
|
769
|
|
770
|
Values of integer and float types can also be compared with \texttt{>} for
|
771
|
greater, \texttt{>=} for greater or equal, \texttt{<} for less, and \texttt{<=}
|
772
|
for less or equal.
|
773
|
|
774
|
\subsubsection{List Operators (Head, Tail, Length, Concatenation)}
|
775
|
|
776
|
The OOAS language provides several basic list operators that make it
|
777
|
easy to use lists.
|
778
|
|
779
|
The first operator is \texttt{hd} which is short for \emph{head}. This
|
780
|
operator returns the first element of a list. Therefore if \texttt{my\_list}
|
781
|
is a list, then \texttt{hd my\_list} is equivalent to \texttt{my\_list[0]}.
|
782
|
|
783
|
The counterpart to \emph{head} is \emph{tail}, which returns the list without
|
784
|
the first element. In OOAS the operator token is \texttt{tl}. So if you want
|
785
|
to remove the first element from a list \texttt{my\_stack} you can write
|
786
|
\texttt{my\_stack := tl my\_stack}.
|
787
|
|
788
|
The next important operation is determining how many elements are currently
|
789
|
in a list, which is the so-called \emph{length} of a list. In OOAS this
|
790
|
operator is written \texttt{len}. For example if an action should only be
|
791
|
enabled if there are less than 10 elements in the list \texttt{my\_stack} you
|
792
|
can write \texttt{requires len my\_stack < 10}.
|
793
|
|
794
|
The last operation is creating a list that contains all the elements of two
|
795
|
given lists, which is called \emph{concatenation}. The operator is written
|
796
|
\texttt{\^}. If for instance you want to append an element \texttt{a} to
|
797
|
a list \texttt{my\_stack}, you can write
|
798
|
|
799
|
\begin{verbatim}
|
800
|
my_stack := [a] ^ my_stack
|
801
|
\end{verbatim}
|
802
|
|
803
|
The example in Figure \ref{Stack} illustrates how these operators can be used
|
804
|
to build a stack.
|
805
|
|
806
|
\begin{figure}[h]
|
807
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
808
|
types
|
809
|
SmallInt = int [0..3];
|
810
|
Stack = autocons system
|
811
|
|[
|
812
|
var
|
813
|
my_stack : list [10] of SmallInt = [0]
|
814
|
actions
|
815
|
obs top (a : SmallInt) = requires (a = hd my_stack) :
|
816
|
skip
|
817
|
end ;
|
818
|
obs pop = requires (len my_stack > 0) :
|
819
|
my_stack := tl my_stack
|
820
|
end;
|
821
|
obs push (a : SmallInt) = requires len my_stack < 10 :
|
822
|
my_stack := [a] ^ my_stack
|
823
|
end
|
824
|
|
825
|
do
|
826
|
var A : SmallInt : push(A) [] pop() [] var B : SmallInt : top(B)
|
827
|
od
|
828
|
]|
|
829
|
system
|
830
|
Stack
|
831
|
\end{lstlisting}
|
832
|
\caption{Stack}
|
833
|
\label{Stack}
|
834
|
\end{figure}
|
835
|
|
836
|
\subsection{The Dood Block}
|
837
|
\label{dood}
|
838
|
|
839
|
The actual behavior of an action system is defined in the so-called \doodblock.
|
840
|
The \doodblock was inspired by Dijkstra's guarded iteration statement. The
|
841
|
canonical form of a \doodblock is to list all named actions of the class
|
842
|
and connect them using the \texttt{[]} operator. In this case in each iteration
|
843
|
an action is available iff its guard evaluates to \texttt{true} and the system
|
844
|
terminates iff no action is enabled.
|
845
|
|
846
|
However, in OOAS actions are neither limited to named actions nor is the
|
847
|
non-deterministic choice the only possible operator.
|
848
|
|
849
|
Instead, all operators described in Section \ref{Composition} are available
|
850
|
as well as the built-in action \texttt{skip} and so-called anonymous actions.
|
851
|
An anonymous action is a guard followed by assignments, methods or built-in
|
852
|
action \texttt{skip}. In literature anonymous actions are often referred to
|
853
|
as \emph{guarded commands}.
|
854
|
|
855
|
If (named) actions are parametrized, enumeration can be used as generalization
|
856
|
of the non-deterministic choice over the values of a data type.
|
857
|
|
858
|
For instance given a data type \texttt{SmallInt = int[0..3]} and a named action
|
859
|
\texttt{doSomething ( a : SmallInt )} it is possible to write
|
860
|
\begin{verbatim}
|
861
|
do
|
862
|
var : A : SmallInt : doSomething(A)
|
863
|
od
|
864
|
\end{verbatim}
|
865
|
|
866
|
as abbreviation for
|
867
|
\begin{verbatim}
|
868
|
do
|
869
|
doSomething(0) [] doSomething(1) [] doSomething(2) [] doSomething(3)
|
870
|
od
|
871
|
\end{verbatim}
|
872
|
|
873
|
|
874
|
|
875
|
\subsection{The System Assembling Block}
|
876
|
\label{SAB}
|
877
|
|
878
|
In the System Assembling Block the system is assembled by its classes. All
|
879
|
the classes used by the system are connected either by the non-deterministic
|
880
|
choice operator \texttt{[]} or by the prioritized composition operator
|
881
|
\texttt{//}. This feature allows the user to manually set the priority among
|
882
|
the classes.
|
883
|
|
884
|
|
885
|
\clearpage
|
886
|
|
887
|
\subsection{Comments}
|
888
|
|
889
|
The OOAS language supports single line comments. Comments start
|
890
|
with a \texttt{\#} symbol.
|
891
|
|
892
|
\subsection{Formal Syntax}
|
893
|
|
894
|
The following EBNF grammar defines the syntax of an Object-Oriented action
|
895
|
system (OOAS). Features that are not implemented at all are left out. However
|
896
|
there are some features that are not completely implemented and do produce
|
897
|
code that doesn't work. These features are stroked out.
|
898
|
\\
|
899
|
|
900
|
\begin{longtable}[h]{lll}
|
901
|
OOAS &:=& ['\texttt{consts}' ConstList] '\texttt{types}' TypeList '\texttt{system}' ASTypeComp \\
|
902
|
ConstList &:=& NamedConst \{ '\texttt{;}' NamedConst \} \\
|
903
|
NamedConst &:=& Identifier '=' Exp \\
|
904
|
TypeList &:=& NamedType \{ '\texttt{;}' NamedType \} \\
|
905
|
NamedType &:=& Identifier '=' ( ComplexType $\vert$ OOActionSystem ) \\
|
906
|
ComplexType &:=& ( '\texttt{list}' '\texttt{[}' ( Num $\vert$ Identifier ) '\texttt{]}' '\texttt{of}' ComplexType ) \\
|
907
|
& & $\vert$ ( '\texttt{[}' Identifier \{ '\texttt{,}' Identifier \} '\texttt{]}' ) \\
|
908
|
& & $\vert$ ( '\texttt{(}' ComplexType \{ '\texttt{,}' ComplexType \} '\texttt{)}' ) \\
|
909
|
& & $\vert$ SimpleType \\
|
910
|
SimpleType &:=& '\texttt{bool}'\\
|
911
|
& & $\vert$ ( '\texttt{int}' '\texttt{[}' ( Num $\vert$ Identifier ) '\texttt{..}' ( Num $\vert$ Identifier ) '\texttt{]}' )\\
|
912
|
& & $\vert$ ( '\texttt{float}' '\texttt{[}' ( FloatNum $\vert$ Identifier ) '\texttt{..}' ( FloatNum $\vert$ Identifier ) '\texttt{]}' )\\
|
913
|
& & $\vert$ '\texttt{char}' \\
|
914
|
& & $\vert$ '\texttt{\{}' Identifier [ '\texttt{=}' Num] \{ '\texttt{,} Identifier [ '\texttt{=}' Num ] \} '\texttt{\}}' \\
|
915
|
& & $\vert$ Identifier \\
|
916
|
OOActionSystem &:=& [ '\texttt{autocons}' ] '\texttt{system}' [ Identifier ] \\
|
917
|
& & '\texttt{|[}' [ '\texttt{var}' AttrList ] [ '\texttt{methods}' MethodList ] \\
|
918
|
& & [ '\texttt{actions}' NamedActionList ] [ '\texttt{do}' [ActionBlock] '\texttt{od}'] '\texttt{]|}' \\
|
919
|
AttrList &:=& Attr \{ '\texttt{;}' Attr \} \\
|
920
|
Attr &:=& [ '\texttt{static}' ] [ '\texttt{obs}' $\vert$ '\texttt{ctr}' ] Identifier '\texttt{:}' ComplexType [ '\texttt{=}' Exp ] \\
|
921
|
MethodList &:=& Method \{ '\texttt{;}' Method \} \\
|
922
|
Method &:=& Identifier [ '\texttt{(}' MethodParamList '\texttt{)}' ] [ '\texttt{:}' ComplexType ] '\texttt{=}' \\
|
923
|
& & [ '\texttt{var}' LocalActionVars '\texttt{begin}' ] ActionBody '\texttt{end}' \\
|
924
|
MethodParamList &:=& Identifier '\texttt{:}' ComplexType \{ '\texttt{,}' Identifier '\texttt{:}' ComplexType \} \\
|
925
|
NamedActionList &:=& NamedAction \{ '\texttt{;}' NamedAction \} \\
|
926
|
NamedAction &:=& [ '\texttt{obs}' $\vert$ '\texttt{ctr}' ] Identifier [ '\texttt{(}' MethodParamList '\texttt{)}' ] \\
|
927
|
& & [ '\texttt{:}' ComplexType ] '\texttt{=}' [ '\texttt{var}' LocalActionVars ] DiscreteActionBody \\
|
928
|
LocalActionVars &:=& Identifier '\texttt{:}' ComplexType \{ '\texttt{;}' Identifier '\texttt{:}' ComplexType\} \\
|
929
|
DiscreteActionBody &:=& '\texttt{requires}' Exp '\texttt{:}' ActionBody '\texttt{end}'\\
|
930
|
Exp &:=& AtomExpression BinOperator AtomExpression \\
|
931
|
AtomExpression &:=& ( [ OpUn ] ( Reference $\vert$ Constant $\vert$ InitComplexType $\vert$ QuantExp\\
|
932
|
&& $\vert$ '\texttt{(}' Exp '\texttt{)}' \{ '\texttt{.}' Identifier \} [ AccessExp] ) \\
|
933
|
&& [ '\texttt{as}' Identifier ] ) \\
|
934
|
& & $\vert$ ( '\texttt{if}' Exp '\texttt{then}' Exp '\texttt{else}' Exp '\texttt{end}' ) \\
|
935
|
OpUn &:=& '\texttt{-}' $\vert$ '\texttt{not}' $\vert$ '\texttt{hd}' $\vert$ '\texttt{tl'} $\vert$ '\texttt{len}'\\
|
936
|
Constant &:=& ('\texttt{true}') $\vert$ ('\texttt{false'}) $\vert$ ('\texttt{nil}') $\vert$ ('\texttt{self}') $\vert$ (FloatNum) $\vert$ (Num) $\vert$ \\
|
937
|
&& (\cancel{StringLiteral}) \\
|
938
|
InitComplexType &:=& InitListType $\vert$ ('\texttt{new}' '\texttt{(}' Identifier [ '\texttt{,}' StringLiteral ] '\texttt{)}') \\
|
939
|
InitListType &:=& '\texttt{[}' Exp [ ListComp $\vert$ \{ '\texttt{,} Exp'\} ] '\texttt{]}' \\
|
940
|
ListComp &:=& '\texttt{|}' '\texttt{var}' Identifier '\texttt{:}' ComplexType \{ \texttt{;} Identifier ComplexType \} '\texttt{\&}' Exp \\
|
941
|
QuantExp &:=& ('\texttt{forall}' $\vert$ '\texttt{exists}') Identifier '\texttt{:}' SimpleType \\
|
942
|
&& \{ '\texttt{,}' Identifier '\texttt{:} SimpleType' \} '\texttt{:}' '\texttt{(}' Exp '\texttt{)}' \\
|
943
|
ActionBody &:=& ActionBodyParallel '\texttt{//}' ActionBodyParallel \\
|
944
|
ActionBodyParallel &:=& ActionBodySeq '\texttt{[]}' ActionBodySeq \\
|
945
|
ActionBodySeq &:=& ActionBodyParen '\texttt{;}' ActionBodyParen \\
|
946
|
ActionBodyParen &:=& ( '\texttt{(}' ActionBody '\texttt{)}' ) $\vert$ ( Statement ) \\
|
947
|
Statement &:=& ( '\texttt{skip'} ) $\vert$ ( Reference \{ '\texttt{,}' Reference \} '\texttt{:=}' Exp \{ '\texttt{,}' Exp\} ) \\
|
948
|
Reference &:=& QualId [ AccessExp ] [ [ '\texttt{::}' '\texttt{(}' Exp '\texttt{)}' ] '\texttt{:>:}' '\texttt{(}' Exp '\texttt{)}' ] \\
|
949
|
AccessExp &:=& ( ( '\texttt{[}' Exp '\texttt{]}' ) $\vert$ ( '\texttt{(}' MethodCallParam '\texttt{)}') ) \\
|
950
|
&& \{( ( '\texttt{[}' Exp '\texttt{]}' ) | ( '\texttt{(}' MethodCallParam '\texttt{)}') ) \} \\
|
951
|
&& [ '\texttt{.}' Identifier \{ '\texttt{.}' Identifier\} AccessExp] \\
|
952
|
QualId &:=& [ '\texttt{self}' '\texttt{.}' ] Identifier \{ '\texttt{.} Identifier'\} \\
|
953
|
MethodCallParam &:=& [ Exp \{ '\texttt{,}' Exp\}]\\
|
954
|
ActionBlock &:=& ActionBlockPar \{ '\texttt{//}' ActionBlockPar\} \\
|
955
|
ActionBlockPar &:=& ActionBlockSeq \{ '\texttt{[]}' ActionBlockSeq\} \\
|
956
|
ActionBlockSeq &:=& [ '\texttt{var}' BlockVarList [\cancel{'\texttt{\&}' Exp} ] '\texttt{:}' ] \\
|
957
|
&&ActionBlockParen \{ '\texttt{;}' ActionBlockParen\}\\
|
958
|
ActionBlockParen &:=& ('\texttt{(}' ActionBlock '\texttt{)}' ) $\vert$ (AnonOrNamedAct)\\
|
959
|
AnonOrNamedAct &:=& DiscreteActionBody $\vert$ '\texttt{skip}' $\vert$ \\
|
960
|
&& Identifier [ '\texttt{(}' MethodCallParam '\texttt{)}' ] [ '\texttt{:>:}' '\texttt{(}' Exp '\texttt{)}' ] \\
|
961
|
BlockVarList &:=& BlockVar \{ '\texttt{;} BlockVar'\} \\
|
962
|
BlockVar &:=& Identifier '\texttt{:}' ComplexType \\
|
963
|
ASTypeComp &:=& ASTypeCompPar \{ '\texttt{//}' ASTypeCompPar\} \\
|
964
|
ASTypeCompPar &:=& ASTypeCompSeq \{ '\texttt{[]}' ASTypeCompSeq\} \\
|
965
|
ASTypeCompSeq &:=& ASTypeCompBP \\
|
966
|
ASTypeCompBP &:=& ('\texttt{(}' ASTypeComp '\texttt{)}' ) \\
|
967
|
BinOperator &:=& ('\texttt{<=>}') $\vert$ ('\texttt{>}')$\vert$ ('\texttt{>=}')$\vert$ ('\texttt{<}')$\vert$ ('\texttt{<=)}')$\vert$ ('\texttt{=}')$\vert$ ('\texttt{<>}')$\vert$ ('\texttt{=>}') $\vert$ ('\texttt{-}')$\vert$ ('\texttt{+}') \\
|
968
|
&&$\vert$ ('\texttt{or}')$\vert$ ('\texttt{and}')$\vert$ ('\texttt{/}') $\vert$ ('\texttt{div}') $\vert$ ('\texttt{*}') $\vert$ ('\texttt{mod}') $\vert$ ('\texttt{\^}')\\
|
969
|
|
970
|
Identifier &:=& Letter \{Letter $\vert$ Digit\}\\
|
971
|
Num &:=& ['\texttt{+}' $\vert$ '\texttt{-}'] Digit \{ Digit \} \\
|
972
|
FloatNum &:=& ['\texttt{+}' $\vert$ '\texttt{-}'] Digit \{ Digit \} '\texttt{.}' Digit \{Digit\} ['\texttt{e}' $\vert$ '\texttt{E}' ['\texttt{+}' $\vert$ '\texttt{-}' ] Digit \{ Digit \}]\\
|
973
|
Letter &:=& '\texttt{\$}' $\vert$ '\texttt{\_}' $\vert$ '\texttt{A}'..'\texttt{Z}' $\vert$ '\texttt{a}'..'\texttt{z}'\\
|
974
|
Digit &:=& '\texttt{0}'..'\texttt{9}'\\
|
975
|
|
976
|
\end{longtable}
|
977
|
\clearpage
|
978
|
|
979
|
\section{Incomplete Features}
|
980
|
|
981
|
The following features are supported by the grammar, but do not produce
|
982
|
executable or useful code.
|
983
|
|
984
|
\subsection{Sequential Block Expression}
|
985
|
|
986
|
In the \doodblock when calling an action with a variable it is possible
|
987
|
to add an additional guard. However if the guard is true, the produced
|
988
|
Prolog-Code will not work.
|
989
|
|
990
|
Example:
|
991
|
\begin{verbatim}
|
992
|
do
|
993
|
var A : SmallInt & A < 3 : push(A)
|
994
|
od
|
995
|
\end{verbatim}
|
996
|
|
997
|
\subsection{String}
|
998
|
|
999
|
It is possible to assign a string to a variable of any list type of char.
|
1000
|
|
1001
|
Example:
|
1002
|
\begin{verbatim}
|
1003
|
var
|
1004
|
my_string : list[20] of char = [0]
|
1005
|
actions
|
1006
|
obs fill = requires true :
|
1007
|
my_string := "Hello World!"
|
1008
|
end
|
1009
|
\end{verbatim}
|
1010
|
|
1011
|
However, in the produced Prolog-Code the characters stored in the list are
|
1012
|
not of type char, but instead Prolog atoms. This may lead to strange behaviour.
|
1013
|
|
1014
|
\section{CADP Target}
|
1015
|
\subsection{The Argos CADP-Target}
|
1016
|
|
1017
|
The CADP-Target is an Add-On for Argos. It produces C files for the use
|
1018
|
with the CADP toolbox available at \url{http://www.inrialpes.fr/vasy/cadp/}.
|
1019
|
It is deployed as dynamic library
|
1020
|
with the file name \texttt{ArgosCadpTarget.dll}. If this file is present
|
1021
|
an additional Argos option \texttt{-c} is available.
|
1022
|
|
1023
|
The invocation of Argos to produce C files for CADP is very similar
|
1024
|
to the invocation of Argos to produce prolog files for Ulysses. Instead
|
1025
|
of using the option \texttt{-p} one has to use the option \texttt{-c} and
|
1026
|
the options \texttt{-n} and \texttt{-d} should be omitted as they are
|
1027
|
meaningless in this context.
|
1028
|
|
1029
|
\subsection{Generating BCG}
|
1030
|
|
1031
|
The generated C file can be used to produce a graph in CADP's proprietary
|
1032
|
BCG format. This is done by compiling the file against CADP's tools using
|
1033
|
the \texttt{cadp\_cc} compiler.
|
1034
|
|
1035
|
Given a shell with the environment variables \texttt{\$CADP} set to the
|
1036
|
CADP directory and \texttt{\$ARGOS} set to the Argos directory one
|
1037
|
can compile an Argos generated C file \texttt{model.c} into an object
|
1038
|
file \texttt{model.o} using the following command:
|
1039
|
\begin{verbatim}
|
1040
|
$CADP/src/com/cadp_cc -g3 -O0 -I. -I$CADP/incl -I$CADP/src/open_caesar \
|
1041
|
-I $ARGOS/trunk/src/cadp/cadpruntime/ -c model.c -o model.o
|
1042
|
\end{verbatim}
|
1043
|
|
1044
|
Now the generator from the CADP toolbox can be compiled using the command:
|
1045
|
\begin{verbatim}
|
1046
|
$CADP/src/com/cadp_cc -g3 -O0 -I. -I$CADP/incl -I$CADP/src/open_caesar \
|
1047
|
-c $CADP/src/open_caesar/generator.c -o generator.o
|
1048
|
\end{verbatim}
|
1049
|
|
1050
|
Finally the two object files can be linked into an executable using the command:
|
1051
|
\begin{verbatim}
|
1052
|
$CADP/src/com/cadp_cc generator.o model.o -o generator \
|
1053
|
-L${BCG:-$CADP}/bin.`$CADP/com/arch` -lcaesar -lBCG_IO -lBCG -lm
|
1054
|
\end{verbatim}
|
1055
|
|
1056
|
\subsection{Animator}
|
1057
|
|
1058
|
For debugging purposes Argos provides a so-called Animator that enables
|
1059
|
one to walk step wise through a model. The models can be either encoded as
|
1060
|
graphs in \texttt{aut} files or as dynamic link library compiled from an Argos
|
1061
|
generated C file. The compilation can be done using any C compiler that is
|
1062
|
capable of generating dynamic link libraries for 32 bit Windows platforms.
|
1063
|
|
1064
|
However, compiling the model to a dynamic link library can be a little bit
|
1065
|
tricky, so a solution file for Microsoft Visual Studio 2008 can be found
|
1066
|
in the argos source directory or to be exact in the sub-directory
|
1067
|
\texttt{cadp/model}. Unfortunately some paths in this file are absolute,
|
1068
|
so they have to be changed to match the paths that are actually used.
|
1069
|
|
1070
|
This can be done by a right-click on \emph{model} within the
|
1071
|
\emph{Solution Explorer}. Now a \emph{model Property Pages} window
|
1072
|
pops up, providing an element \emph{Configuration Properties}. This
|
1073
|
element can be expanded, and \emph{C/C++} has to be chosen. The first
|
1074
|
entry of this page, called \emph{Additional Include Directories} has
|
1075
|
to be changed to fit.
|
1076
|
|
1077
|
\section{Alarm System}
|
1078
|
|
1079
|
\subsection{Overview}
|
1080
|
In this section a model of a Car Alarm System is presented. The purpose is
|
1081
|
to show how Object-Oriented Action Systems can be used to model real world
|
1082
|
system in contrast to the examples presented so far. The Car Alarm System
|
1083
|
has been a demonstrator in the MOGENTES project. The specifications were
|
1084
|
provided by Ford. This demonstrator was also used in \cite{Aichernig2010a}.
|
1085
|
|
1086
|
|
1087
|
\subsection{Requirements}
|
1088
|
|
1089
|
In \cite{Aichernig2010a} the specification was condensed to the following three
|
1090
|
requirements:
|
1091
|
|
1092
|
\textbf{R1: Arming.} The system is armed 20 seconds
|
1093
|
after the vehicle is locked and the bonnet, luggage compartment, and
|
1094
|
all doors are closed.
|
1095
|
|
1096
|
\textbf{R2: Alarm.} The alarm sounds for 30 seconds if
|
1097
|
an unauthorized person opens the door, the luggage compartment, or the
|
1098
|
bonnet. The hazard flasher lights will flash for five minutes.
|
1099
|
|
1100
|
\textbf{R3: Deactivation.} The CAS
|
1101
|
can be deactivated at any time, even when the alarm is sounding, by
|
1102
|
unlocking the vehicle from outside.
|
1103
|
|
1104
|
\subsection{State Chart}
|
1105
|
|
1106
|
In \cite{Aichernig2010a} a UML transformation tool was used to generate an
|
1107
|
Object-Oriented action system. The paper contains a state chart which is cited
|
1108
|
in Figure \ref{statechart}. In contrast the action system presented in this
|
1109
|
manual was written by hand but it is somehow based on this State Chart
|
1110
|
regarding the interpretation of the requirements.
|
1111
|
|
1112
|
\begin{figure}[h]
|
1113
|
\includegraphics[width=1\linewidth,keepaspectratio]{figures/SM_AlarmSystem}
|
1114
|
\caption{State Chart of Car Alarm System}
|
1115
|
\label{statechart}
|
1116
|
\end{figure}
|
1117
|
\clearpage
|
1118
|
\subsection{Object-Oriented Action System}
|
1119
|
|
1120
|
\subsubsection{Interface}
|
1121
|
|
1122
|
In the context of generating labeled transition systems for \emph{Ulysses}
|
1123
|
the interface of an Object-Oriented action system consists of named actions.
|
1124
|
According to the ioco theory, labels have to be marked as either input or
|
1125
|
output. In Object-Oriented action systems the corresponding keywords are
|
1126
|
\texttt{ctr} resp. \texttt{obs}.
|
1127
|
|
1128
|
Therefore the interface of the Car Alarm System consists of 4 controllable
|
1129
|
actions \texttt{Close}, \texttt{Open}, \texttt{Lock} and \texttt{Unlock}.
|
1130
|
In the context of the implementation these actions correspond to the input
|
1131
|
coming from various sensors. In the context of a generated test case these
|
1132
|
actions correspond to outputs to the System Under Test.
|
1133
|
|
1134
|
Also there are 6 observable actions \texttt{ArmedOn}, \texttt{ArmedOff},
|
1135
|
\texttt{SoundOn}, \texttt{SoundOff}, \texttt{FlashOn}, and \texttt{FlashOff}.
|
1136
|
In the context of the implementation these action correspond to output that
|
1137
|
triggers the resp. signals to the environment.
|
1138
|
In the context of the generated test cases these actions correspond to the
|
1139
|
expected inputs coming from the System Under Test.
|
1140
|
|
1141
|
\subsubsection{Time Handling}
|
1142
|
|
1143
|
One important aspect of modeling such a system is time handling. In former
|
1144
|
models within the MOGENTES project passing of time had been modeled by
|
1145
|
introducing an observable action \emph{after}. Later in the project this
|
1146
|
caused some problems as some test cases were not generated.
|
1147
|
|
1148
|
To solve these problems the after action in this model is removed. Instead,
|
1149
|
elapsed time is now encoded as first parameter of every remaining action.
|
1150
|
|
1151
|
\subsubsection{Protocol Layer}
|
1152
|
|
1153
|
In the context of model-ling an embedded system the \doodblock can be thought
|
1154
|
as protocol layer. To keep the model simple, the most canonical form of the
|
1155
|
\doodblock has been used. That is, all named actions are connected using
|
1156
|
the non-deterministic choice. Since the named actions are parametrized,
|
1157
|
enumeration is used. Unfortunately the size of the state space grows
|
1158
|
exponentially by number of enumerated values, so it is very important
|
1159
|
to keep the resp. ranges as small as possible. In the context of this model,
|
1160
|
where the meaning of each action's parameter is the elapsed time, this
|
1161
|
means that only ``interesting'' time periods are considered. Actually,
|
1162
|
``interesting'' events only happen immediately, 20, 30 or 270 seconds
|
1163
|
after the previous event. Exactly these values are contained in the
|
1164
|
Enum Type \texttt{TimeSteps}.
|
1165
|
|
1166
|
\subsubsection{Non-determinism}
|
1167
|
|
1168
|
This model makes use of non-determinism. That means that there are situations
|
1169
|
in which the system can choose how it responses to a certain input.
|
1170
|
More technically that means, that there sequences of controllable and
|
1171
|
observable actions, after which there is more than one observable action.
|
1172
|
In the context of using the model to specify a system that means
|
1173
|
underspecification. A system can choose among some possible options how to
|
1174
|
react.
|
1175
|
|
1176
|
In this particular model, non-determinism is used so that the implementation
|
1177
|
has some freedom with regards to the exact sequence of observable actions.
|
1178
|
For example when an intrusion is detected by the alarm system, then three
|
1179
|
events happen immediately: The arming is set off, the sound alarm is set
|
1180
|
on and the flash alarm is set on. A deterministic system would specify the
|
1181
|
exact order, in which these actions must be triggered. In the context of
|
1182
|
test case generation this could lead to some false positives, as the
|
1183
|
requirements do not specify a fixed order.
|
1184
|
|
1185
|
\subsubsection{Code}
|
1186
|
%\begin{figure}[h]
|
1187
|
\begin{lstlisting}[language=ooa,linewidth=\textwidth,breaklines,basicstyle=\scriptsize]
|
1188
|
types
|
1189
|
TimeSteps = {Int0 = 0 , Int20 = 20, Int30 = 30, Int270 = 270} ;
|
1190
|
Int = int[0..270] ;
|
1191
|
SmallInt = int[0..3] ;
|
1192
|
AlarmSystem = autocons system
|
1193
|
|[
|
1194
|
var
|
1195
|
open : bool = true ;
|
1196
|
locked : bool = false ;
|
1197
|
armed : bool = false ;
|
1198
|
soundAlarm : bool = false ;
|
1199
|
flashAlarm : bool = false ;
|
1200
|
blockingLevel : SmallInt = 0 ;
|
1201
|
armedOnNow : bool = false ;
|
1202
|
armedOnLater : bool = false ;
|
1203
|
armedOff : bool = false ;
|
1204
|
soundOn : bool = false ;
|
1205
|
soundOffNow : bool = false ;
|
1206
|
soundOffLater : bool = false ;
|
1207
|
flashOn : bool = false ;
|
1208
|
flashOffNow : bool = false ;
|
1209
|
flashOffLater : bool = false ;
|
1210
|
silent : bool = false # true after alarms turned off
|
1211
|
actions
|
1212
|
ctr Close ( waittime : Int) =
|
1213
|
requires not flashAlarm and not soundAlarm :
|
1214
|
requires open and waittime = 0 and blockingLevel = 0 and locked and silent:
|
1215
|
open := false ;
|
1216
|
blockingLevel := 1 ;
|
1217
|
armedOnNow := true ;
|
1218
|
silent := false
|
1219
|
end []
|
1220
|
requires open and waittime = 0 and blockingLevel = 0 and not locked and silent:
|
1221
|
silent := false ;
|
1222
|
open := false
|
1223
|
end []
|
1224
|
requires open and waittime = 0 and blockingLevel = 0 and locked and not silent:
|
1225
|
open := false ;
|
1226
|
blockingLevel := 1 ;
|
1227
|
armedOnLater := true
|
1228
|
end []
|
1229
|
requires open and waittime = 0 and blockingLevel = 0 and not locked and not silent:
|
1230
|
open := false
|
1231
|
end
|
1232
|
end ;
|
1233
|
ctr Open ( waittime : Int) =
|
1234
|
requires true :
|
1235
|
requires not open and waittime = 0 and blockingLevel = 0 and not armed :
|
1236
|
open := true
|
1237
|
end []
|
1238
|
requires not open and waittime = 0 and blockingLevel = 0 and armed :
|
1239
|
open := true ;
|
1240
|
armed := false ;
|
1241
|
blockingLevel := 3 ;
|
1242
|
armedOff := true ;
|
1243
|
soundOn := true ;
|
1244
|
flashOn := true
|
1245
|
end
|
1246
|
end ;
|
1247
|
ctr Unlock ( waittime : Int) =
|
1248
|
requires true :
|
1249
|
requires locked and waittime = 0 and blockingLevel = 0 and not flashAlarm and soundAlarm:
|
1250
|
locked := false ;
|
1251
|
silent := false ;
|
1252
|
soundOffLater := false ;
|
1253
|
soundOffNow := true ;
|
1254
|
blockingLevel := 1
|
1255
|
end []
|
1256
|
requires locked and waittime = 0 and blockingLevel = 0 and flashAlarm and soundAlarm :
|
1257
|
locked := false ;
|
1258
|
flashOffNow := true ;
|
1259
|
blockingLevel := 2 ;
|
1260
|
silent := false ;
|
1261
|
soundOffLater := false ;
|
1262
|
soundOffNow := true
|
1263
|
end []
|
1264
|
requires locked and waittime = 0 and blockingLevel = 0 and not flashAlarm and not soundAlarm:
|
1265
|
locked := false ;
|
1266
|
silent := false ;
|
1267
|
armedOff := true ;
|
1268
|
blockingLevel := 1
|
1269
|
end []
|
1270
|
requires locked and waittime = 0 and blockingLevel = 0 and flashAlarm and not soundAlarm:
|
1271
|
locked := false ;
|
1272
|
flashOffNow := true ;
|
1273
|
flashOffLater := false ;
|
1274
|
blockingLevel := 1 ;
|
1275
|
silent := false
|
1276
|
end
|
1277
|
end;
|
1278
|
ctr Lock ( waittime : Int) =
|
1279
|
requires true :
|
1280
|
requires not locked and waittime = 0 and blockingLevel = 0 and open :
|
1281
|
locked := true
|
1282
|
end []
|
1283
|
requires not locked and waittime = 0 and blockingLevel = 0 and not open :
|
1284
|
locked := true ;
|
1285
|
blockingLevel := 1 ;
|
1286
|
armedOnLater := true
|
1287
|
end
|
1288
|
end ;
|
1289
|
obs ArmedOn (waittime : Int) =
|
1290
|
requires (armedOnNow or armedOnLater):
|
1291
|
requires (waittime = 20 and armedOnLater) :
|
1292
|
armedOnLater := false ;
|
1293
|
blockingLevel := blockingLevel - 1 ;
|
1294
|
armed := true
|
1295
|
end
|
1296
|
[] requires (waittime = 0 and armedOnNow) :
|
1297
|
armedOnNow := false ;
|
1298
|
blockingLevel := blockingLevel - 1 ;
|
1299
|
armed := true
|
1300
|
end
|
1301
|
end ;
|
1302
|
obs ArmedOff (waittime : Int) =
|
1303
|
requires (waittime = 0 and armedOff) :
|
1304
|
armedOff := false ;
|
1305
|
blockingLevel := blockingLevel - 1 ;
|
1306
|
armed := false
|
1307
|
end ;
|
1308
|
obs SoundOn (waittime : Int) =
|
1309
|
requires true :
|
1310
|
requires (waittime = 0 and soundOn and blockingLevel = 1) :
|
1311
|
soundOn := false ;
|
1312
|
blockingLevel := blockingLevel - 1 ;
|
1313
|
soundAlarm := true ;
|
1314
|
soundOffLater := true
|
1315
|
end []
|
1316
|
requires (waittime = 0 and soundOn and blockingLevel <> 1) :
|
1317
|
soundOn := false ;
|
1318
|
blockingLevel := blockingLevel - 1 ;
|
1319
|
soundAlarm := true
|
1320
|
end
|
1321
|
end ;
|
1322
|
obs SoundOff (waittime : Int) =
|
1323
|
requires (soundOffNow or soundOffLater) :
|
1324
|
requires (waittime = 30 and soundOffLater) :
|
1325
|
soundOffLater := false ;
|
1326
|
flashOffLater := true ;
|
1327
|
soundAlarm := false
|
1328
|
end
|
1329
|
[] requires (waittime = 0 and soundOffNow) :
|
1330
|
soundOffNow := false ;
|
1331
|
blockingLevel := blockingLevel - 1 ;
|
1332
|
soundAlarm := false
|
1333
|
end
|
1334
|
end ;
|
1335
|
obs FlashOn (waittime : Int) =
|
1336
|
requires true :
|
1337
|
requires (waittime = 0 and flashOn and blockingLevel = 1) :
|
1338
|
flashOn := false ;
|
1339
|
blockingLevel := blockingLevel - 1 ;
|
1340
|
flashAlarm := true ;
|
1341
|
soundOffLater := true
|
1342
|
end []
|
1343
|
requires (waittime = 0 and flashOn and blockingLevel <> 1) :
|
1344
|
flashOn := false ;
|
1345
|
blockingLevel := blockingLevel - 1 ;
|
1346
|
flashAlarm := true
|
1347
|
end
|
1348
|
end ;
|
1349
|
obs FlashOff (waittime : Int) =
|
1350
|
requires (flashOffNow or flashOffLater) :
|
1351
|
requires (waittime = 270 and flashOffLater) :
|
1352
|
flashOffLater := false ;
|
1353
|
flashAlarm := false ;
|
1354
|
silent := true
|
1355
|
end
|
1356
|
[] requires (waittime = 0 and flashOffNow) :
|
1357
|
flashOffNow := false ;
|
1358
|
blockingLevel := blockingLevel - 1 ;
|
1359
|
flashAlarm := false
|
1360
|
end
|
1361
|
end
|
1362
|
do
|
1363
|
var A : TimeSteps : Close (A) []
|
1364
|
var B : TimeSteps : Open (B) []
|
1365
|
var C : TimeSteps : Lock (C) []
|
1366
|
var D : TimeSteps : Unlock (D) []
|
1367
|
var E : TimeSteps : ArmedOn (E) []
|
1368
|
var F : TimeSteps : ArmedOff (F) []
|
1369
|
var G : TimeSteps : SoundOn (G) []
|
1370
|
var H : TimeSteps : SoundOff (H) []
|
1371
|
var I : TimeSteps : FlashOn (I) []
|
1372
|
var J : TimeSteps : FlashOff (J)
|
1373
|
od
|
1374
|
]|
|
1375
|
system
|
1376
|
AlarmSystem
|
1377
|
\end{lstlisting}
|
1378
|
%\caption{Car Alarm System in OOAS}
|
1379
|
%\label{Stack}
|
1380
|
%\end{figure}
|
1381
|
|
1382
|
\subsection{Labeled Transition System}
|
1383
|
|
1384
|
In Figure \ref{lts} you can find a graphical representation
|
1385
|
of labeled transition system that corresponds to the Object-Oriented
|
1386
|
action system. It is a ioco product graph produced by \emph{Ulysses}.
|
1387
|
So there is an additional observable action \emph{delta} that denotes
|
1388
|
quiescence. Iff in a given state the system has no specified output,
|
1389
|
there is a self loop labeled with \emph{delta}.
|
1390
|
|
1391
|
\begin{figure}[h]
|
1392
|
\includegraphics[angle=90,width=0.42\linewidth,keepaspectratio]{figures/out}
|
1393
|
\caption{Labeled Transition System}
|
1394
|
\label{lts}
|
1395
|
\end{figure}
|
1396
|
|
1397
|
\section*{Acknowledgements}
|
1398
|
%Research herein was
|
1399
|
Funded by the European Artemis Joint Undertaking project
|
1400
|
MBAT, Combined Model-based Analysis and Testing of Embedded Systems %.
|
1401
|
%ART Call 2010: 269335.
|
1402
|
and by the Austrian Research Promotion Agency
|
1403
|
(FFG), program line ``Trust in IT Systems'', project number 829583, TRUst via Failed FALsification of Complex
|
1404
|
Dependable Systems Using Automated Test Case Generation through Model
|
1405
|
Mutation (TRUFAL).
|
1406
|
|
1407
|
\clearpage
|
1408
|
|
1409
|
|
1410
|
\bibliographystyle{plain}
|
1411
|
\bibliography{papers}
|
1412
|
|
1413
|
|
1414
|
\end{document}
|