Prolog中列表的连接

dam*_*uar 13 list prolog

有人可以帮助在此规则中找到错误吗?

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat).
Run Code Online (Sandbox Code Playgroud)

尝试连接2个列表失败:

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

no
Run Code Online (Sandbox Code Playgroud)

m09*_*m09 17

要按照您的预期方式修复代码,您只需要在最后一次调用中转换Head[Head]最后concat/3一个子句中.问题是你Head只用第一个参数调用你的谓词,这不是一个列表.

虽然,这里有几个注释:

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

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

append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
    append(Tail, List, Rest).
Run Code Online (Sandbox Code Playgroud)

您可以在此处或在" 现在学习Prolog"中找到最近帖子的其他资源!教程如果你想学习如何正确使用递归.

  • 是的,输入`trace.您将进入跟踪模式.要离开它,输入`notrace`.你将处于调试模式.要退出调试模式,请键入`nodebug`,然后您将返回正常模式! (3认同)

小智 5

可以通过使用append来完成。

concatenate(List1, List2, Result):-
   append(List1, List2, Result).
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。