Prolog =.. 谓词的使用

Use of Prolog =.. predicate

我正在做一个练习,尝试使用 =.. 谓词编写一个过程,删除 List 中 PredName(X) 失败的所有元素和 returns 剩余列表结果:

filter(List, PredName, Result)

在这种情况下,PredName 被定义为:

test(N) :- atom(N).

例如:

?- filter([a,b,-6,7,A,-1,0,B], test, L).
L = [a,b,-6,7,-1,0],

我得到了以下信息,但我不确定为什么在使用上面的示例进行测试时我总是得到错误的结果:

test(N):-
    atomic(N).
filter([], _, []).
filter2([H|T], PredName, [H|S]):-
    Goal =.. [PredName, H],Goal,filter(T, PredName, S),!.
filter([H|T], PredName, S) :-
    filter2(T, PredName, S).

我从 here 得到了上面的代码。

您是否尝试编译代码?

我得到:

Clauses of filter/3 are not together in the source-file

为什么?因为你需要决定如何调用谓词:Eitherfilter2/3orfilter/3。您目前正在使用这两个名称。

此外,当您有如下代码时:

Goal =.. [PredName, H],
Goal

只需使用call/2代替。比如上面可以等价地写成:

call(PredName, H)

总结:

  • 确定谓词名称并坚持使用
  • 不要在这种情况下使用(=..)/2
  • 使用call/2.

已修复。我以前没有注意到的命名有问题。 将 filter2 重命名为 filter 并且有效。