有人可以帮忙查找此规则中的错误吗?
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
答案 0 :(得分:17)
要按照您的预期方式修改代码,您只需在最后一句中对Head
的最后一次调用中将[Head]
转换为concat/3
。问题是你使用Head
作为第一个参数调用了谓词,而不是列表。
虽然,这里有几个注释:
[Head|[]]
相当于[Head]
这是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).