Inference rules are the rules which help to determine the particular version of an overloaded function (that with generic parameters) in an expression.
Because the ST old standart doesn't support overloaded functions declared by an user, there are no ST language means how to describe them. So we will use C-like notation.
Example
ADD(ANY_MAGNITUDE, ANY_MAGNITUDE, ... ) => ANY_MAGNITUDE
Overloaded functions may be specialized in an expression which means there are rules how to specify, which non-generic types will be used for the parameters for the function.
Example
ADD_INT(INT, INT, ... ) => INT
Goal of the inference rules is to determine suitable specialized function for the expression given any particular argument values.
Example
VAR ix, iy : INT; dix, diy : DINT; rx, ry : REAL; rlx, rly : LREAL; END_VAR ADD (1, 2, 3) => the expression is the same as ADD_DINT. (note: if not specified otherwise then the 1, 2, 3 constants are interpreted as DINT types) ADD (ix, iy) => ADD_INT ADD (rx, ix) => ADD_REAL ADD (ix, diy, rlx) => ADD_LREAL
Inference process for an expression goes roughly this way:
Example
for an expression
ADD (ix, diy, rlx)
there is one p-group with generic type ANY_MAGNITUDE in the ADD function, and the parameters IN1, IN2, IN3 belongs into it and corresponding arguments are ix, diy, rlx. Thus c-type is determined to be LREAL. As a result the above expression is equivalent to the expression:
ADD_LREAL(ix, diy, rlx) and result is LREAL
Example
MUX(K := dix, IN0 := rx, IN1 := dix)
there are two p-groups, ANY_INT and ANY. Parameter K belongs to former group and IN0, IN1 into the latter one. Thus ANY_INT group's c-type is DINT and ANY's group c-type is REAL. As a result the above expression is equivalent to the expression:
MUX_DINT_REAL (K := dix, IN0 := rx, IN1 := dix) a výsledek je REAL