2011-09-06 16 views
0

假設我有一個列表ListSum,我想追加一個新的列表ListSum遞歸,像序言:一個列表追加到自身

appList(ListSum):- 
    %%generate a list: ListTemp, 
    append(ListTemp,ListSum,ListSum), 
    appList(ListSum). 

但附加(ListTemp,ListSum,ListSum)沒有工作以我想要的方式。

任何人都可以幫我嗎?

乾杯

回答

2

你要明白統一的概念(或實際上是「匹配」的序言中實現)。您不能將兩個或更多值綁定到同一個變量。一旦匹配,Prolog中的變量一直持續其價值,直到達到最終目標,或者失敗。在那之後,如果有更多的可能性,那麼該變量會用另一個值重新實例化,依此類推。

例如,如果我查詢APPLIST([]),然後追加將被測試,以作爲匹配:

append(ListTemp,[],[]) 

如果ListTemp不是空的列表中,該子句將失敗,因爲語義追加的是「用第二個參數附加第一個參數,兩個都是列表,導致第三個」。對appList(ListSum)的遞歸調用將被稱爲appList([]),因爲ListSum先前與[]匹配,導致無限遞歸(幸運的是,如果ListTemp不是[],則不會到達)。

在子句中必須有兩個參數,其中一個是原始列表,另一個是結果列表。 append的前兩個參數是ListSum和ListTemp(取決於你想要的追加順序),而第三個是結果列表。完成,不需要遞歸。

+0

感謝您的回答,但我還挺需要使用遞歸,因爲我不知道有多少ListTemp將產生然而。 – SamChen

+0

謝謝,我想我明白你現在說的話。 – SamChen

+0

你會介意給大拇指嗎? – LeleDumbo

0

這裏有一個非遞歸的解決方案,不知道爲什麼你甚至不需要遞歸:

appself(L,X) :- append(L,L,X).