Difference between pages "Changes to the Mathematical Language of Event-B" and "Code Generation Tutorial"

From Event-B
(Difference between pages)
Jump to navigationJump to search
imported>Laurent
 
imported>Andy
 
Line 1: Line 1:
This document describes the evolution of the Event-B mathematical language that will soon take place. The previous version of the language will still be supported.
+
'''This Page is Under Construction'''
  
== Generic Identity and Projections ==
+
=== Tutorial Overview ===
  
Three operators were still unary while they could be atomic and generic:
+
The aim of the tutorial is to allow users to explore the approach with a relatively simple example. The example uses a shared buffer with reader and writer processes. The tutorial is presented in three stages, making use of the example projects from the download site. There are two translations performed, one is to a common language model (IL1). The second is to an Event-B project which includes a model of the implementation. There is a PrettyPrinter for Ada source code, which uses the common language model.
* the identity relation <math>\id</math>
 
* the first projection  <math>\prjone</math>
 
* the second projection <math>\prjtwo</math>
 
  
These operators are defined as follows in the old version:
+
A typical Event-B development may be refined to the point where it is ready for implementation, but the Event-B language is not expressive enough to fully describe the implementation. Tasking Event-B facilitates this final step to implementation, by extending Event-B with the necessary constructs. Event-B machines that are to be implemented (and their seen Contexts) are selected and added to a ''Tasking Development''; the Tasking Development files have the file extension ''.tasking''. The machines in the Tasking Development are then extended with implementation details.
  
<math>
+
The example/tutorial projects are,
\begin{matrix}
 
  E\mapsto F &\in\id(S) && E\in S\;\land\; F = E\\
 
  (E\mapsto F)\mapsto G &\in\prjone(r)
 
  && E\mapsto F\in r\;\land\; G = E\\
 
  (E\mapsto F)\mapsto G &\in\prjtwo(r)
 
  && E\mapsto F\in r\;\land\; G = F    .
 
\end{matrix}
 
</math>
 
  
If we drop the parameter, we get
+
{| border="1"
much more straightforward definitions that capture the essence of the
+
|SharedBuffer20100819Demo
operator. The new definitions are
+
|An example project with a completed Tasking Development and IL1 model (post IL1 translation, but before Event-B translation).
 +
|-
 +
|Sharedbuffer20100819Tasking
 +
|Same as the example project above, but with Event-B model translations. The difference being that this development includes a model of the implementation. These are refinements that include a program counter to describe flow of execution in each task.
 +
|-
 +
|SharedBuffer20100819Tutorial
 +
|A bare project for step 1 of the tutorial.
 +
|-
 +
|Sharedbuffer20100819Tutorial2
 +
|A partially completed tasking development for steps 2 and 3 of the tutorial.
 +
|}
  
<math>
+
== Preliminaries ==
\begin{matrix}
+
Before further discussion of the modelling aspects, we take a look at the PrettyPrint viewers. The PrettyPrinters make the viewing of tasking models easier, and provides a quick route to source code generation. The source code can easily be pasted into an Ada source file from the IL1 Pretty Printer window.
E\mapsto F &\in\id && E = F\\
+
==== The PrettyPrint View of a Tasking Development ====
(E\mapsto F)\mapsto G &\in\prjone && E = G\\
+
From the top-menu select ''Window/Show View/Other/Tasking Pretty Printer''.
(E\mapsto F)\mapsto G &\in\prjtwo && F = G    .
 
\end{matrix}
 
</math>
 
  
We have the following equivalence between the old
+
Note that the Tasking PrettyPrinter may have to be closed when editing the Tasking Development, since it can give rise to exceptions. The PrettyPrinter would need further work to make it robust, however it is intended only as a short-term solution.
and the new versions of the operators
 
  
<math>
+
Open the ''SharedBuffer20100819Demo'' Project and switch to the Resource Perspective. Open the ''.tasking'' model and inspect it. Clicking on the Main, Machine or Event nodes updates the pretty print window.
\begin{matrix}
 
    \textbf{Old Version} & \textbf{New Version}\\
 
    \id(S)  & S\domres id\\
 
    \prjone(r) & r\domres\prjone\\
 
    \prjtwo(r) & r\domres\prjtwo  .
 
\end{matrix}
 
</math>
 
  
Moreover, in the case where the parameter is not needed, then it can
+
==== Viewing Source Code ====
be dropped altogether: no domain restriction is needed.  For instance,
 
to express that a relation <math>r</math> is irreflexive, one would now write
 
<math>r\binter\id = \emptyset</math>.
 
  
== Partition ==
+
aka. The PrettyPrint View of an IL1 Model.
  
A new partition predicate is introduced. It is intended to provide an easier way to enter enumerated sets, while getting rid of the <math>\frac{n(n-1)}{2}</math> axioms needed to express pairwise distinctness (or disjointness). The partition operator is defined as follows:
+
From the top-menu select ''Window/Show View/Other/IL1 Pretty Printer''.
  
<math>
+
Open the ''SharedBuffer20100819Demo'' Project and switch to the Resource Perspective. Open the ''.il1'' model and inspect it. Clicking on the Protected, Main Entry, or Task nodes updates the pretty print window.
\begin{array}{ll}
 
partition(E_0, E_1, \ldots, E_n)\defi &
 
  E_0 = E_1\bunion \cdots\bunion E_n \\ &
 
  \;\land\; E_1\binter E_2=\emptyset
 
  \;\land\;\cdots
 
  \;\land\; E_{n-1}\binter E_n = \emptyset \\ &
 
  (\;\land\; i \ne j \limp E_i \binter E_j = \emptyset ) \\
 
\end{array}
 
</math>
 
  
 +
==== Cleaning the Tasking Development ====
  
where the <math>E_i</math> are expressions bearing the same type.
+
If the ''.tasking'' file has errors, then it may need cleaning. To do this right-click on the ''Main'' node, select ''Epsilon Translation/CleanUp''.
  
Then, we can enter into a context :
+
== The Tutorial ==
 +
The steps will be as follows,
 +
* Step 1 - Create the tasking development.
 +
* Step 2 - Add annotations.
 +
* Step 3 - Invoke translators.
  
<math>
+
==== Creating The Tasking Development ====
  \begin{array}{ll}
 
    \mathsf{set}  & S\\
 
    \mathsf{constant}  & a_1\\
 
    \vdots & \vdots\\
 
    \mathsf{constant}  & a_n\\
 
    \mathsf{axiom}  & partition(S, \{a_1\}, \ldots, \{a_n\})
 
  \end{array}
 
</math>
 
  
which is a particular case of a set being defined by listing all its elements.
+
From the Event-B Perspective,
  
== Operator Associativity ==
+
Open the SharedBuffer20100819Tutorial Project.
  
Operators used to build sets of relations or functions, viz.
+
Select the following Machines: Reader, Writer and Shared.
* relation
 
* total relation
 
* surjective relation
 
* total surjective relation
 
* partial function
 
* total function
 
* partial injection
 
* total injection
 
* partial surjection
 
* total surjection
 
* bijection
 
  
have no more relative priorities and loose associativity. Instead, users have to make it explicit by entering parenthesis in formulas.
+
Right-click and select Make Tasking Development/Generate Tasking Development.
 +
 
 +
The new Tasking Development will not be visible in the Event-B perspective, change to the resource perspective, open and inspect the new .tasking file. The Tasking Development contains the machines that we wish to provide implementations for. In order to introduce the new concepts we have prepared a partially complete development.
 +
 
 +
Go to the Project SharedBuffer20100819Tutorial2 to begin the next step.
 +
 
 +
==== Providing the Annotations for Implementations ====

Revision as of 09:27, 8 December 2010

This Page is Under Construction

Tutorial Overview

The aim of the tutorial is to allow users to explore the approach with a relatively simple example. The example uses a shared buffer with reader and writer processes. The tutorial is presented in three stages, making use of the example projects from the download site. There are two translations performed, one is to a common language model (IL1). The second is to an Event-B project which includes a model of the implementation. There is a PrettyPrinter for Ada source code, which uses the common language model.

A typical Event-B development may be refined to the point where it is ready for implementation, but the Event-B language is not expressive enough to fully describe the implementation. Tasking Event-B facilitates this final step to implementation, by extending Event-B with the necessary constructs. Event-B machines that are to be implemented (and their seen Contexts) are selected and added to a Tasking Development; the Tasking Development files have the file extension .tasking. The machines in the Tasking Development are then extended with implementation details.

The example/tutorial projects are,

SharedBuffer20100819Demo An example project with a completed Tasking Development and IL1 model (post IL1 translation, but before Event-B translation).
Sharedbuffer20100819Tasking Same as the example project above, but with Event-B model translations. The difference being that this development includes a model of the implementation. These are refinements that include a program counter to describe flow of execution in each task.
SharedBuffer20100819Tutorial A bare project for step 1 of the tutorial.
Sharedbuffer20100819Tutorial2 A partially completed tasking development for steps 2 and 3 of the tutorial.

Preliminaries

Before further discussion of the modelling aspects, we take a look at the PrettyPrint viewers. The PrettyPrinters make the viewing of tasking models easier, and provides a quick route to source code generation. The source code can easily be pasted into an Ada source file from the IL1 Pretty Printer window.

The PrettyPrint View of a Tasking Development

From the top-menu select Window/Show View/Other/Tasking Pretty Printer.

Note that the Tasking PrettyPrinter may have to be closed when editing the Tasking Development, since it can give rise to exceptions. The PrettyPrinter would need further work to make it robust, however it is intended only as a short-term solution.

Open the SharedBuffer20100819Demo Project and switch to the Resource Perspective. Open the .tasking model and inspect it. Clicking on the Main, Machine or Event nodes updates the pretty print window.

Viewing Source Code

aka. The PrettyPrint View of an IL1 Model.

From the top-menu select Window/Show View/Other/IL1 Pretty Printer.

Open the SharedBuffer20100819Demo Project and switch to the Resource Perspective. Open the .il1 model and inspect it. Clicking on the Protected, Main Entry, or Task nodes updates the pretty print window.

Cleaning the Tasking Development

If the .tasking file has errors, then it may need cleaning. To do this right-click on the Main node, select Epsilon Translation/CleanUp.

The Tutorial

The steps will be as follows,

  • Step 1 - Create the tasking development.
  • Step 2 - Add annotations.
  • Step 3 - Invoke translators.

Creating The Tasking Development

From the Event-B Perspective,

Open the SharedBuffer20100819Tutorial Project.

Select the following Machines: Reader, Writer and Shared.

Right-click and select Make Tasking Development/Generate Tasking Development.

The new Tasking Development will not be visible in the Event-B perspective, change to the resource perspective, open and inspect the new .tasking file. The Tasking Development contains the machines that we wish to provide implementations for. In order to introduce the new concepts we have prepared a partially complete development.

Go to the Project SharedBuffer20100819Tutorial2 to begin the next step.

Providing the Annotations for Implementations