使用Prolog = ..谓词

时间:2016-07-29 12:27:57

标签: prolog meta-predicate

我正在进行一项练习,我正在尝试使用= ..谓词来编写一个过程,该过程删除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获得了上述代码。

2 个答案:

答案 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,并且工作正常。