我做的序言名單some exercises,我已經讀過this的問題,看到了subtract/3實施。但我仍然有點困惑。如何綁定變量,而名單上的遞歸?
現在我想從給定的列表中刪除元素的所有occurrencies,並試了幾次後,我有這樣的:
% --- del all X occurrences from a list
del_all_X(_, [], _).
% unbinded T2
del_all_X(X, [X|T], T2):-
del_all_X(X, T, T2).
%!. ERROR: see below
del_all_X(Y, [X|T], [X|T2]):-
dif(Y, X), % USE this instead of !
del_all_X(Y, T, T2).
這給了我這種類型的輸出:
25 ?- del_all_X(x, [x,a,b,x,d,e,x,x], X).
X = [a, b, d, e|_G4115].
- 這是思想的正確方法,同時結合自由變量(如
T2_)? - 如何有乾淨輸出?
回答:del_all_X(_,[],[])。
- 有沒有caling外部功能更簡單的實現?
感謝
編輯:加改正,並在問題和代碼的答案。
你得到的非實例尾巴在結果的原因是因爲你的基礎情況下它說,'del_all_X(_,[] _)'。如果你從空列表中刪除任何東西,你會得到一個匿名列表('_')。我不確定我是否理解你的評論,你想*在此解綁定'T2' *,因爲整個問題是將'T2'綁定到給定謂詞子句的結果。從邏輯上講,如果從空列表中刪除任何元素,則可能希望它導致空列表。所以這應該是'del_all_X(_,[],])。'。欲瞭解更多通用性,擺脫切('!')和使用'dif'。 – lurker
謝謝del_all_X(_,[],[])。解決了這個小問題。 我的意思是從上面列出的教程中,不清楚如何管理輸出變量。我錯誤地認爲,在基本情況下,所有輸出列表都存儲在哪裏。 – bastaPasta
我加了!爲了消除X仍然存在的其他輸出情況,我只想要完整的答案,即第一個答案。 編輯:你說得對,它也是這樣。 – bastaPasta