2016-11-25 68 views
1

我想編寫一個程序,它從列表中刪除每個第N個元素,而不是最後一個元素。我的程序已經正常工作,給了我正確的結果,但是當我詢問另一個結果時,prolog帶有錯誤「>/2:參數沒有充分實例化」。這裏是我到目前爲止的代碼:刪除列表中的所有N個元素

delete_elements([],0,[]). 
delete_elements([],_,[_|_]). 
delete_elements(L,N,R) :- 
    length(L,LL), 
    LL > N, 
    nth1(N,L,_,RZ), 
    NZ is N + 1, 
    delete_elements(RZ,NZ,RR), 
    R = RR. 
delete_elements(L,N,R) :- 
    length(L,LL), 
    LL =< N, 
    delete_elements([],_,R), 
    L = R. 

我認爲遞歸的取消條件有問題。如何解決這個問題?

在此先感謝!

回答

1

的問題是條款中:

delete_elements(L,N,R) :- 
    length(L,LL), 
    LL =< N, 
    delete_elements([],_,R), 
    L = R. 

你已經完成了你的工作,但你還是叫使用匿名變量,而不是你的N.謂詞你可以這樣寫:

delete_elements(L,N,L) :- 
    length(L,LL), 
    LL =< N. 

例:

?- delete_elements([1,2,3,4,5,6,7,8,9,1,2,3],3,L). 
L = [1, 2, 4, 6, 8, 1, 3] ; 
false. 

對於你在你的評論中提出的問題,我的實施將是:

delete_elements(L,N,R) :- delete_elements(L,1,N,R). 

delete_elements([],_,_,[]). 
delete_elements([X],N,N,[X]). 
delete_elements([X|Xs],N,N,Rs):- length([X|Xs],Y),Y>1,delete_elements(Xs,1,N,Rs). 
delete_elements([X|Xs],P,N,[X|Rs]):- P < N,P1 is P+1,delete_elements(Xs,P1,N,Rs). 
+0

謝謝!你知道爲什麼該程序只適用於N = 2?如何使程序適用於每個N(1,3等)? – zer0kai

+1

給出一個輸入期望輸出的例子... – coder

+0

例如,當我要求delete_elements([1,2,3,4,5,6,7,8,9],3,R)時,輸出應該是R = [1,2,4,5,7,8,9],因爲最後一個元素(9)應該在列表中。 – zer0kai

相關問題