/ GENTLE PRIMER
/ Describing Computations
A predicate is declared by giving its signature and its rules.
'action' length (ColorList -> INT) 'rule' length (list(Head, Tail) -> N+1) : length(Tail -> N) 'rule' length (nil -> 0)The signature of a predicate specifies its interface to the caller. It gives the name of the predicate and lists its parameter types. For example,
'action' length (ColorList -> INT)introduces a predicate length that has one input parameter of type ColorList and one output parameter of type INT.
Expressions and patterns in rule headings and invocations must be valid for the corresponding type.
In addition, a signature specifies the category of the predicate, which is action in the above example. The category of a predicate indicates how it is used and what its evaluation strategy is.
The general form is
Type names are separated by commas. If there are no output parameters, the arrow is omitted.
Parameter specifications may include identifiers for documentation:
'action' length (L: ColorList -> N: INT) -- on exit N is the number of elements of L