Rules with a Guard

The full syntax of a rule is: ( Head :- [Guard | ] Body )

where Guard is a multiset of type constraints of the form: &math(p(\$p_1,\ldots,\$p_n));.

Type constraints put constraints on the shapes of processes (or the names of unary atoms) with which the process contexts specified in its arguments can match. The type constraint name &math(p); is drawn from a built-in set and specifies which kind of constraints is imposed.


Here is an example rule with guard:

waitint($p) :- int($p) | ok.

This rule can be thought of as an abbreviation of the following infinite number of rules:

waitint(0) :- ok.
waitint(1) :- ok.
waitint(-1):- ok.
waitint(2) :- ok.

The following list contains examples of some type constraints that can be written in Guard:


In reality, each type constraint name (such as int or <) has its own mode of usage that specifies which of its arguments are input arguments. The effect of the constraint specified by a type constraint is enabled only after the shapes (or values) of its input arguments are all determined. For example, $r = $p + $q proceeds only if $p and $q are determined.

The same abbreviation scheme as defined for atoms applies to type constraints when a process context name &math(\$p_i); occurs exactly two times in the rule. For example, p($n) :- $n>$z, 0($z) | ok can be abbreviated to p($n) :- $n>0 | ok.

Typed Process Contexts

A process context name $p constrained in Guard is said to be typed in that rule. As a syntactic sugar, typed process context names can be written as link names as follows:

( Res = gen(N) :- N > 0 | Res = [N|gen(N-1)] ), p(gen(10))

Guard Library

Currently, the following type constraints can be written in the guard. The + specifies an input argument.

'='(+Unary,-Unary)         - equivalence
'='(-Unary,+Unary)         - equivalence
'=='(+Unary,+Unary)        - equivalence
int(+Float,-Int)           - cast
float(+Int,-Float)         - cast
345(-Int)                  - for every integer,  not only with 345
'-3.14'(-Float)            - for every floating, not only with -3.14
'<'(+Int,+Int)             - integer comparison,  as well as: > =< >= =:= =\=
'+'(+Int,+Int,-Int)        - integer operation,   as well as: - * / mod
'<.'(+Float,+Float)        - floating comparison, as well as: >. =<. >=. =:=. =\=.
'+.'(+Float,+Float,-Float) - floating operation,  as well as: -. *. /.

Front page List of pages Search Recent changes Backup   Help   RSS of recent changes