2012-02-19 80 views
10

有人可以帮助查找此规则中的错误吗?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 

回答

14

要解决你的代码,你意的方式,你只需要在你的最后一次通话的最后一句话,在转变Head[Head]concat/3 。问题在于你只用Head作为第一个参数来调用谓词,这不是一个列表。

虽然,这里有几个注意事项:

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

这里是SWI-PL的版本,暗示你对好序言递归:

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

您可以在最近的帖子在这里或在Learn Prolog Now!教程中找到其他资源,如果你想学习如何使用递归正常。

+0

感谢您的帮助。还有一个问题:是否有可能看到序言如何解释程序?例如,堆栈跟踪可以帮助查看问题。 – damluar 2012-02-19 12:03:32

+3

是,输入'trace.'。您将进入跟踪模式。要离开它,请输入'notrace'。你将进入调试模式。要离开调试模式,输入'nodebug.',你将回到正常模式! – m09 2012-02-19 15:08:13

+0

我使用gnu prolog,它适用于我。谢谢! – damluar 2012-02-19 18:10:15

4

它可以通过使用append完成。

concatenate(List1, List2, Result):- 
    append(List1, List2, Result). 

希望这会有所帮助。

0

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

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3).