PROLOG代码出错

时间:2012-05-01 18:36:48

标签: prolog

我是prolog的新手。

我希望PROLOG中的代码能够产生下面给出的预期输出。有人可以告诉我哪里出错了。

代码基本上是删除重复项并以所需格式生成o / p。

remove_dups([],_L2,_L2).
remove_dups([A|B],L2,L3) :- 
    functor(A,Pr,Ar),(member(level(Pr,Ar,1) ,L2) -> remove_dups(B,L2,L2); append([level(Pr,Ar,1)],L2,L3),remove_dups(B,L3,L3)).

预期产出:

 ?- remove_dups([a,b,a],[],L).

L = [level(a,0,1),level(b,0,1)].

1 个答案:

答案 0 :(得分:1)

对于初学者,我宁愿将这两个步骤分开:删除重复项和提示级别。

    remove_dups([],[]).
    remove_dups([X|Xs],Ys) :- member(X,Xs), !, remove_dups(Xs,Ys).
    remove_dups([X|Xs],[X|Ys]) :- remove_dups(Xs,Ys).

    levels([],[]).
    levels([X|Xs],[level(N,A,1)|Ys]):- functor(X,N,A), levels(Xs,Ys).

    go(L,R):- remove_dups(L,RL), levels(RL,R).

我不得不承认,级别中的常数1让我感到困惑。你确定它不应该更有意义吗?

我还假设列表元素的顺序并不重要:remove_dups删除除最后一个元素之外的所有重复元素。如果您想保留第一次出现,则必须修改remove_dups