我正在学习Prolog而我跟着 this tutorial for graphs。 这是我的代码:
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.
要使用此功能,请致电
?- path(a, f, Length, Path, []).
但是,我想将其缩短为:
?- path(a, f, Length, Path).
但我无法使用默认参数。
答案 0 :(得分:6)
非常简单:只需定义一个谓词,该谓词调用执行工作的谓词:
func (f *File) Open() (io.ReadCloser, error) {
在Prolog中,谓词始终与// Open returns a `ReadCloser` that provides access to the File's contents.
// Multiple files may be read concurrently.
一起引用,因为相同的名称但不同的arity使它们成为两个单独的谓词。因此,现在您的计划将定义path(X, Y, Length, Path) :-
path(X, Y, Length, Path, []).
和Name/Arity
。
关于命名:如果两个谓词都是您的界面的一部分,它们应该具有相同的名称。 Prolog标准库中的许多示例,例如format/1
, format/2
, format/3
。
但是,如果工作谓词仅用作辅助谓词,通常会给它一个后缀。使用简单的path/4
:
path/5
我见过list_max/2
只是下划线的代码:list_max([X|Xs], Max) :-
list_max_SUFFIX(Xs, X, Max).
(并且你在同一谓词谱系中继续为更多辅助谓词添加下划线);或者,下划线+数字:SUFFIX
(并且你增加数字);或list_max_/3
+可选号码,如果您有更多:list_max_1/3
。使用下划线+数字:
_aux
但等等,还有更多。如果对名称代表参数的谓词使用命名方案,则可以获得setup_call_cleanup/3
和call_cleanup/2
,定义为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).
和setup_call_cleanup(true, Goal, Cleanup)
。我发现这个命名方案很好,因为它是自我记录的,但正如这个例子所示,如果你的谓词有太多的参数,它可能会变得过多。