0

我正在做一个练习,我试图使用 =.. 谓词编写一个过程,该过程删除 List 中 PredName(X) 失败的所有元素,并将剩余列表作为结果返回:

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).

我从这里得到了上面的代码。

4

2 回答 2

4

您是否尝试编译代码?

我得到:

filter/3 的子句不在源文件中

为什么?因为您需要决定如何调用谓词:Either filter2/3 filter/3. 您当前正在使用这两个名称。

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

目标 =.. [PredName, H],
目标

只需使用. 例如,上面可以等效地写成:call/2

呼叫(预命名,H)

总之:

  • 决定谓词名称并坚持下去
  • 不要用于(=..)/2这种情况
  • 使用call/2. _
于 2016-07-29T12:34:27.917 回答
0

解决它。有一个我以前没有发现的命名问题。将 filter2 重命名为 filter 并且它起作用了。

于 2016-07-29T12:57:12.940 回答