我正在进行一项练习,我正在尝试使用= ..谓词来编写一个过程,该过程删除List中PredName(X)失败的所有元素,并将剩余的列表作为Result返回:
test(N) :- atom(N).
在这种情况下,PredName被定义为:
?- 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).
我有以下内容,但是我不确定为什么在使用上面的示例进行测试时,为什么我会继续变错:
strings.xml
我从here获得了上述代码。
答案 0 :(得分:4)
您是否尝试编译代码?
我明白了:
Clauses of filter/3 are not together in the source-file
为什么呢?因为您需要决定如何调用谓词: filter2/3
或 filter/3
。您目前正在使用这两个名称。
此外,如果您有以下代码:
Goal =.. [PredName, H], Goal
只需使用 call/2
代替。例如,以上内容可以等效地编写为:
call(PredName, H)
总结:
(=..)/2
来处理此类情况call/2
。答案 1 :(得分:0)
修正了它。我之前没有注意到的命名问题。 将filter2重命名为filter,并且工作正常。