# Difference between revisions of "Mathematical Language Evolution Design"

imported>Nicolas m (→Parser Changes) |
imported>Nicolas m (→Upgrade) |
||

Line 84: | Line 84: | ||

Thus, implementors of those interfaces are required to implemented new methods, while subclassers of {{class|DefaultVisitor}} and {{class|DefaultSimpleVisitor}} should consider whether or not to override them. | Thus, implementors of those interfaces are required to implemented new methods, while subclassers of {{class|DefaultVisitor}} and {{class|DefaultSimpleVisitor}} should consider whether or not to override them. | ||

− | |||

− | |||

== Upgrade == | == Upgrade == | ||

Line 96: | Line 94: | ||

In these cases an upgrade procedure will be applied to the formula using a {{class|IFormulaRewriter}}, to rewrite KPRJ1, KPRJ2, KID expressions into their generic equivalent (see [[Changes to the Mathematical Language of Event-B#Generic Identity and Projections]]). | In these cases an upgrade procedure will be applied to the formula using a {{class|IFormulaRewriter}}, to rewrite KPRJ1, KPRJ2, KID expressions into their generic equivalent (see [[Changes to the Mathematical Language of Event-B#Generic Identity and Projections]]). | ||

− | === Formatting === | + | Upgraded formulas can be obtained from a formula string by calling one of the new {{class|FormulaFactory}} {{method|upgrade}} methods. |

+ | |||

+ | === File upgrade === | ||

+ | |||

+ | Existing rodin files with V1 formulas inside need converting to V2 formulas. Concerned files are: | ||

+ | * Contexts | ||

+ | * Machines | ||

+ | * Proofs | ||

+ | |||

+ | This is managed through the version tools of the rodin core package: a new version number for each of these files represents the passing from V1 to V2 mathematical language. | ||

+ | The following table summarizes the correspondence between file version number and mathematical version number: | ||

+ | |||

+ | |||

+ | {| border="4" | ||

+ | |+ File / Math versions correspondence | ||

+ | ! scope=col | | ||

+ | ! scope=col |Math V1 | ||

+ | ! scope=col |Math V2 | ||

+ | |- | ||

+ | ! scope=row |Context | ||

+ | |<math>V < 2</math> | ||

+ | |<math>V \geqslant 2</math> | ||

+ | |- | ||

+ | ! scope=row |Machine | ||

+ | |<math>V < 4</math> | ||

+ | |<math>V \geqslant 4</math> | ||

+ | |- | ||

+ | ! scope=row |Proof | ||

+ | |<math>V < 1</math> | ||

+ | |<math>V \geqslant 1</math> | ||

+ | |} | ||

+ | |||

+ | |||

+ | In those XML files, the formulas are written inside various attributes. Existing version conversion tools (in {{package|org.rodinp.core}}) allowed making changes to the structure of the files (adding an element, renaming an attribute, …), through XSL transformations, targetting a single element to apply the conversion to.<br /> | ||

+ | But upgrading formulas entails dealing with the contents of attributes in various elements dispatched all over the file. So, extending the conversion tools, a new conversion operation is implemented ({{class|ModifyAttribute}}) that changes the contents of an attribute, together with a new kind of file conversion: 'multiple' conversion, in contrast to 'simple' conversion. This new one allows targetting several elements through unrestricted XPath expressions.<br /> | ||

+ | |||

+ | These new core tools extend the existing 'conversions' extension point. It now allows writing conversion extensions in {{package|org.eventb.core}} client package that target every assignment, expression or predicate in any context, machine or proof file and upgrade their contents to the new language version.<br /> | ||

+ | |||

+ | The modifying code is delegated to the client that must provide, in the conversion extension, a class that implements {{class|IAttributeModifier}}. It builds the new string value of the attribute from the value read in the file. In our case, it builds a V2 formula that is the upgraded equivalent to the given V1 formula. | ||

+ | |||

+ | === Formula upgrade === | ||

+ | |||

+ | ==== Formatting ==== | ||

Ideally, upgrading a formula would preserve its previous formatting (spaces, tabs, new lines). But this turns out being quite tricky. | Ideally, upgrading a formula would preserve its previous formatting (spaces, tabs, new lines). But this turns out being quite tricky. | ||

Line 121: | Line 161: | ||

* if the formula does not use deprecated expressions, nor lacks parentheses around relational set operators, it is left unchanged, preserving the formatting | * if the formula does not use deprecated expressions, nor lacks parentheses around relational set operators, it is left unchanged, preserving the formatting | ||

* it it does, it is rewritten and any previous formatting is overridden | * it it does, it is rewritten and any previous formatting is overridden | ||

+ | |||

+ | ==== Detecting missing parentheses ==== | ||

+ | |||

+ | {{TODO}} | ||

+ | |||

+ | ==== Typing generic operators ==== | ||

+ | |||

+ | {{TODO}} | ||

+ | |||

+ | ==== Not upgradable cases ==== | ||

+ | |||

+ | {{TODO}} | ||

+ | |||

+ | |||

+ | == Sequent Prover == | ||

+ | {{TODO}} | ||

+ | |||

[[Category:Event-B]] | [[Category:Event-B]] | ||

[[Category:Design]] | [[Category:Design]] |

## Revision as of 15:19, 17 April 2009

## Introduction

This document describes the modifications that occur to the Event-B mathematical language from the developer point of view. The old language will still be recognized, in order to provide backward compatibility.

These changes are described from a user point of view in Changes to the Mathematical Language of Event-B.

## Abstract Syntax Tree

Deprecated nodes (becoming atomic expressions):

- KPRJ1
- KPRJ2
- KID

New nodes:

- KPARTITION that represents the new partition predicate (multiple predicate)
- KPRJ1_GEN that represents the generic atomic version of the first projection
- KPRJ2_GEN that represents the generic atomic version of the second projection
- KID_GEN that represents the generic atomic version of the identity

### Parser Changes

The new parser has a version attribute. Depending on the version, formulas are parsed differently. Thus, the KPARTITION node is a regular identifier if version is V1. It is accepted as a keyword only from version V2. Concerning identity and projections, they are recognized as non-generic with V1 and generic with V2. The following table summarizes how tokens are processed depending on the language version:

Language V1 | Language V2 | |
---|---|---|

"partition" | IDENT | KPARTITION |

"id" | KID | KID_GEN |

"prj1" | KPRJ1 | KPRJ1_GEN |

"prj2" | KPRJ2 | KPRJ2_GEN |

#### Parsing

FormulaFactory has new parse() methods with a language version argument. Existing methods default to the first version (LanguageVersion.V1), while becoming deprecated. Thus, one now has to know, before parsing a formula, the version of the language it has been written with. It also provides methods to upgrade to the new language version.

#### Multiple Predicates / Partition

A new predicate class is introduced: MultiplePredicate, in which the partition predicate is implemented. A MultiplePredicate is a predicate that applies to a list of one or more expressions. In a partition, all expressions must have the same type, that is the type of the partitioned set (first child).

#### Associativity

Newly non associative relational set operators now require parentheses around their operands for parsing to succeed. This is managed directly by the parser. Unparsing also requires those parentheses, so the BinaryExpression.toString() method has been changed accordingly.

#### Visitors

Partition, identity and projections also entail new visitor methods, as follows:

IVisitor has 6 more methods:

- enterKPARTITION(MultiplePredicate)
- continueKPARTITION(MultiplePredicate)
- exitKPARTITION(MultiplePredicate)
- visitKID_GEN(AtomicExpression)
- visitKPRJ1_GEN(AtomicExpression)
- visitKPRJ2_GEN(AtomicExpression)

ISimpleVisitor has 1 more method:

- visitMultiplePredicate(MultiplePredicate)

Thus, implementors of those interfaces are required to implemented new methods, while subclassers of DefaultVisitor and DefaultSimpleVisitor should consider whether or not to override them.

## Upgrade

Formulas written with version V1 will need upgrading to version V2. However, most of the V1 formulas will be exactly the same with V2. A formula needs ugrading if:

- it contains one of {KPRJ1, KPRJ2, KID}
- it contains a non parenthesised sequence of relational set operators

In these cases an upgrade procedure will be applied to the formula using a IFormulaRewriter, to rewrite KPRJ1, KPRJ2, KID expressions into their generic equivalent (see Changes to the Mathematical Language of Event-B#Generic Identity and Projections).

Upgraded formulas can be obtained from a formula string by calling one of the new FormulaFactory upgrade methods.

### File upgrade

Existing rodin files with V1 formulas inside need converting to V2 formulas. Concerned files are:

- Contexts
- Machines
- Proofs

This is managed through the version tools of the rodin core package: a new version number for each of these files represents the passing from V1 to V2 mathematical language. The following table summarizes the correspondence between file version number and mathematical version number:

Math V1 | Math V2 | |
---|---|---|

Context | ||

Machine | ||

Proof |

In those XML files, the formulas are written inside various attributes. Existing version conversion tools (in

) allowed making changes to the structure of the files (adding an element, renaming an attribute, …), through XSL transformations, targetting a single element to apply the conversion to.

But upgrading formulas entails dealing with the contents of attributes in various elements dispatched all over the file. So, extending the conversion tools, a new conversion operation is implemented (ModifyAttribute) that changes the contents of an attribute, together with a new kind of file conversion: 'multiple' conversion, in contrast to 'simple' conversion. This new one allows targetting several elements through unrestricted XPath expressions.

These new core tools extend the existing 'conversions' extension point. It now allows writing conversion extensions in

client package that target every assignment, expression or predicate in any context, machine or proof file and upgrade their contents to the new language version.

The modifying code is delegated to the client that must provide, in the conversion extension, a class that implements IAttributeModifier. It builds the new string value of the attribute from the value read in the file. In our case, it builds a V2 formula that is the upgraded equivalent to the given V1 formula.

### Formula upgrade

#### Formatting

Ideally, upgrading a formula would preserve its previous formatting (spaces, tabs, new lines). But this turns out being quite tricky. Indeed, it prevents from simply rewriting the formula then applying a toString(), as this would totally forget and override any formatting. Thus, we would have to write directly into the original string. Firstly find the source locations where changes will occur, then patching the formula with the new expression versions at those source locations.

But that leads to more complexity when we come to consider formulas that contain

- recursive relational set operators (that recursively shift source locations)
- binary operators with higher priorities nearby (that mindlessly absorb a member of the rewritten expression)

Let's look at the following formula:

A straight rewriting would proceed as follows:

- which already is false (requires parentheses)

Then, with the appropriate shift of the source location to replace the first operator:

- which is even worse

This suggests putting parentheses around rewritten expressions. But they would sometimes be superfluous, which brings us to distinguish cases where they are needed and cases where they are not, depending on the priority of the operators nearby.

Considering this is going quite far, a simpler upgrade method is applied:

- if the formula does not use deprecated expressions, nor lacks parentheses around relational set operators, it is left unchanged, preserving the formatting
- it it does, it is rewritten and any previous formatting is overridden

#### Detecting missing parentheses

**TODO**

#### Typing generic operators

**TODO**

#### Not upgradable cases

**TODO**

## Sequent Prover

**TODO**