函数式谓词

传统上在 Prolog 中,函数(带有一个输出和绑定输入)被写为常规谓词:

mangle(X,Y) :- Y is (X*5)+2.

这可能会产生这样的困难:如果多次调用函数式谓词,则需要菊花链临时变量。

multimangle(X,Y) :- mangle(X,A), mangle(A,B), mangle(B,Y).

在大多数 Prolog 中,可以通过编写替代中缀运算符来代替 is 来避免这种情况,is 扩展表达式,包括替代函数。

% Define the new infix operator
:- op(900, xfy, <-).

% Define our function in terms of the infix operator - note the cut to avoid
% the choice falling through
R <- mangle(X) :- R is (X*5)+2, !.

% To make the new operator compatible with is..
R <- X :-
    compound(X),            % If the input is a compound/function
    X =.. [OP, X2, X3],     % Deconstruct it
    R2 <- X2,               % Recurse to evaluate the arguments
    R3 <- X3,
    Expr =.. [OP, R2, R3],  % Rebuild a compound with the evaluated arguments
    R is Expr,              % And send it to is
    !.
R <- X :- R is X, !.        % If it's not a compound, just use is directly

我们现在可以写:

multimangle(X,Y) :- X <- mangle(mangle(mangle(Y))).

但是,一些现代的 Prolog 更进一步,为这种类型的谓词提供了自定义语法。例如,在 Visual Prolog 中:

mangle(X) = Y :- Y = ((X*5)+2).
multimangle(X,Y) :- Y = mangle(mangle(mangle(X))).

请注意,<- 运算符和上面的函数式谓词仍然表现为关系 - 它们具有选择点并执行多个统一是合法的。在第一个例子中,我们使用剪切来防止这种情况。在 Visual Prolog 中,使用关系的函数语法是正常的,并且以正常方式创建选择点 - 例如,目标 X = (std::fromTo(1,10))*10 成功绑定 X = 10,X = 20,X = 30,X = 40 等。