函式式謂詞
傳統上在 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 等。