2016-05-14 34 views
0

我仍然在學習遞歸的概念。 我想遞歸地添加一個列表的元素到另一個列表的頭部,同時消除任何重複。我使用的代碼對一個原子工作正常。這是沒有遞歸的代碼:在Prolog中遞歸地插入一個列表的元素到另一個列表中

insert(H,L,[H|L]):- 
    not(member(H,L)). 
insert(H,L,L):- 
    member(H,L). 

但是,當我嘗試遞歸時,我沒有得到預期的輸出。我知道我在寫插入/ 3謂詞錯誤。

insert([H|T],[H1|T1],[H,H1|T1]):- 
    not(member(H,[H1|T1])):- 
    insert(T,[H,H1|T1],L). 

insert([H|T],[H1|T1],[H1|T1]):- 
    member(H,[H1|T1]), 
    insert(T,[H1|T1],L). 

insert([],L,L). 

我很感激關於如何糾正上述代碼錯誤的任何想法。

回答

0

您的原始插入可以在另一個「insert_all」子句中組成。例如...

% insert_all(NEW_ELEMENTS, LIST_TO_ADD_ELEMENTS_TO, OUTPUT) 

insert_all([], O, O). 
insert_all([X | T], I, O) :- 
    insert(X, I, ITMP), 
    insert_all(T, ITMP, O). 

輸出示例:

1 ?- insert_all([a,b,c], [1,2,c], O). 
O = [b, a, 1, 2, c]. 

你也可以簡化insert以避免做not(member(...))檢查...

insert(H,L,L):- 
    member(H,L), !. 
insert(H,L,[H|L]). 

「剪切」 告訴如果insert條款中前面的子條款獲得通過,Prolog不會試圖嘗試替代方案。所以如果成員失敗,它只會做第二個條款。

相關問題