函数式谓词
传统上在 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 等。