我还在学习递归的概念。 我希望递归地将一个列表的元素添加到另一个列表的头部,同时消除任何重复。我使用的代码适用于原子。这是没有递归的代码:
insert(H,L,[H|L]):-
not(member(H,L)).
insert(H,L,L):-
member(H,L).
然而,当我尝试递归时,我没有得到预期的输出。我理解我正在编写insert / 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 :(得分: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]).
" cut"如果insert
子句中的前面子条款成功,则告诉Prolog不要尝试替代方案。因此,如果成员失败,它将只执行第二个子句。