函式式謂詞

傳統上在 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 等。