Line 18: | Line 18: | ||
** ProB makes use of a unification-based type inference algorithm. As such, typing information can not only flow from left-to-right inside a formula, but also from right-to-left. For example, it is sufficient to type <tt>xx<:yy & yy<:NAT</tt> instead of typing both <tt>xx</tt> and <tt>yy</tt> in ProB. | ** ProB makes use of a unification-based type inference algorithm. As such, typing information can not only flow from left-to-right inside a formula, but also from right-to-left. For example, it is sufficient to type <tt>xx<:yy & yy<:NAT</tt> instead of typing both <tt>xx</tt> and <tt>yy</tt> in ProB. | ||
** Similar to Rodin, ProB extracts typing information from all predicates. As such, it is sufficient to write <tt>xx/:{1,2}</tt> to assign a type to <tt>xx</tt>. | ** Similar to Rodin, ProB extracts typing information from all predicates. As such, it is sufficient to write <tt>xx/:{1,2}</tt> to assign a type to <tt>xx</tt>. | ||
** the fields of records are normalized (sorted); hence <tt>rec(a:0,b:1) = rec(b:y,a:x)</tt> is | ** the fields of records are normalized (sorted); hence the predicate <tt>rec(a:0,b:1) = rec(b:y,a:x)</tt> is correctly typed for ProB. | ||
* DEFINITIONS: the definitions and its arguments are checked by ProB. We believe this to be an important feature for a formal method language. However, as such, every DEFINITION must be either a predicate, an expression or a substitution. You '''cannot''' use, for example, lists of identifiers as a definition. Also, for the moment, the arguments to DEFINITIONS have to be expressions. | * DEFINITIONS: the definitions and its arguments are checked by ProB. We believe this to be an important feature for a formal method language. However, as such, every DEFINITION must be either a predicate, an expression or a substitution. You '''cannot''' use, for example, lists of identifiers as a definition. Also, for the moment, the arguments to DEFINITIONS have to be expressions. |
As of version 1.3, ProB contains a much improved parser which tries be compliant with
Atelier B as much as possible.
There is also a plugin for Atelier B for use withthe standalone Tcl/Tk Version on Atelier B projects.
Note however, that the transitive closure operator closure1 is fully supported, and hence one can translate an expression closure(e), where e is a binary relation over some domain d, into the expression closure1(e) \/ id(d).