2016-05-14 74 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不会试图尝试替代方案。所以如果成员失败,它只会做第二个条款。

相关问题