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/4和path/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/4和from_to_length_path_acc/5.我发现这个命名方案很好,因为它是自我记录的,但正如这个例子所示,如果你的谓词有太多的参数,它可能会变得过多.