2012-05-01 53 views
0

我是序言新手。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

對於初學者我寧願兩個步驟分離:除去重複的和呈現電平的。

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

我不得不承認的是,在水平tripples不斷1我感到困惑。你確定它不應該有多大意義嗎?

我還假定列表元素的順序並不重要:remove_dups刪除除最後一個元素以外的所有重複元素。如果你想保持第一次出現,remove_dups必須修改。

+0

非常感謝@Alexander的答案。我將在後來的程序中使用這個1進行等級映射和分層。沒有必要維持訂單..再次感謝 –

+0

不客氣! –