2012-02-19 117 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).