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

时间:2016-03-09 05:25:35

标签: prolog optional-parameters default-parameters

我正在学习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).

但我无法使用默认参数。

1 个答案:

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