编写Prolog谓词以向另一个谓词提供默认参数

Sua*_*ado 1 prolog optional-parameters default-parameters

我正在学习Prolog,我在本教程中学习 了图表.这是我的代码:

path(X, Y, Length, [X,Y], _) :- 
   connect(X, Y, Length).   
path(X, Y, Length, [X|P], V) :- 
   \+ member(X, V),
   connect(X, Z, Length1),
   path(Z, Y, Length2, P, [X|V]),
   Length is Length1 + Length2.
Run Code Online (Sandbox Code Playgroud)

为了使用它,我打电话

?- path(a, f, Length, Path, []).
Run Code Online (Sandbox Code Playgroud)

但是,我想将其缩短为:

?- path(a, f, Length, Path).
Run Code Online (Sandbox Code Playgroud)

但是我无法获得默认参数.

小智 6

非常简单:只需定义一个谓词,该谓词具有调用执行工作的谓词的相同名称:

path(X, Y, Length, Path) :-
    path(X, Y, Length, Path, []).
Run Code Online (Sandbox Code Playgroud)

在Prolog中,谓词总是被称为Name/Arity同名,但不同的arity使它们成为两个独立的谓词.所以,现在你的程序将同时具有path/4path/5定义.

至于命名:如果两个谓词都是您的界面的一部分,它们应该具有相同的名称.在Prolog的标准库的例子很多,例如format/1,format/2,format/3.

但是,如果工作谓词仅用作辅助谓词,通常会给它一个后缀.使用简单的东西list_max/2:

list_max([X|Xs], Max) :-
    list_max_SUFFIX(Xs, X, Max).
Run Code Online (Sandbox Code Playgroud)

我已经看到代码SUFFIX只是一个下划线:( list_max_/3并且你继续在同一个谓词谱系中添加更多辅助谓词的下划线); 或者,下划线+数字:( list_max_1/3并且你增加数字); 或者,_aux+可选数字,如果你有更多:list_max_aux/3.使用下划线+数字:

list_max_1([], Max, Max).
list_max_1([X|Xs], Max0, Max) :-
    compare(Order, X, Max0),
    list_max_2(Order, X, Max0, Xs, Max).

list_max_2(<, _, Max0, Xs, Max) :- list_max_1(Xs, Max0, Max).
list_max_2(=, _, Max0, Xs, Max) :- list_max_1(Xs, Max0, Max).
list_max_2(>, X, _, Xs, Max) :- list_max_1(Xs, X, Max).
Run Code Online (Sandbox Code Playgroud)

但等等,还有更多.如果对名称代表参数的谓词使用命名方案,则可以获得setup_call_cleanup/3,并call_cleanup/2定义为setup_call_cleanup(true, Goal, Cleanup).有了这个命名方案,你会打电话给你的"路径"也许谓词from_to_length_path/4from_to_length_path_acc/5.我发现这个命名方案很好,因为它是自我记录的,但正如这个例子所示,如果你的谓词有太多的参数,它可能会变得过多.

  • s(X)为您精心解答! (3认同)