在Prolog

时间:2016-05-14 12:01:44

标签: list recursion prolog

我还在学习递归的概念。 我希望递归地将一个列表的元素添加到另一个列表的头部,同时消除任何重复。我使用的代码适用于原子。这是没有递归的代码:

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).

我很感激如何纠正上述代码中的错误。

1 个答案:

答案 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不要尝试替代方案。因此,如果成员失败,它将只执行第二个子句。