Prolog中列表的连接

时间:2012-02-19 11:09:05

标签: list prolog

有人可以帮忙查找此规则中的错误吗?

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat).

尝试连接2个列表失败:

| ?- concat([1,2], [4,7,0], What).

no

4 个答案:

答案 0 :(得分:17)

要按照您的预期方式修改代码,您只需在最后一句中对Head的最后一次调用中将[Head]转换为concat/3。问题是你使用Head作为第一个参数调用了谓词,而不是列表。

虽然,这里有几个注释:

  • [Head|[]]相当于[Head]
  • 你的算法复杂度很低,n!我相信。
  • 在你的第二个子句之后没有插入切口,你通过调用你的第三个子句生成无限的选择点,长度为1的列表(因此调用你的第二个子句,然后通过你的第三个子句,等等。 。无限循环)。

这是SWI-pl的版本,暗示您要进行良好的序言递归:

append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
    append(Tail, List, Rest).

如果您想了解如何正确使用递归,可以在此处或Learn Prolog Now!教程中找到最新帖子的其他资源。

答案 1 :(得分:5)

可以使用append。

来完成
concatenate(List1, List2, Result):-
   append(List1, List2, Result).

希望这有帮助。

答案 2 :(得分:1)

实现非常简单。 串联仅是将第二个列表追加到第一个列表的末尾。 继续添加,直到第一个列表用完元素。现在,向其中添加第二个列表。

ap([],L,L).
ap([H|T],L,[H|Z]):- ap(T,L,Z).

输出

?-ap([1,2,3],[a,b,c],List).
  List=[1,2,3,a,b,c]

?-ap([1,2,3],[a,b],List).
  List=[1,2,3,a,b]

?-ap([1,2],[a,b,c],List).
  List([1,2,a,b,c])

?-ap([],[],List).
  List=[]

答案 3 :(得分:0)

这是两个列表规则之间的串联:

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3). 
相关问题