假設我有一個列表ListSum,我想追加一個新的列表ListSum遞歸,像序言:一個列表追加到自身
appList(ListSum):-
%%generate a list: ListTemp,
append(ListTemp,ListSum,ListSum),
appList(ListSum).
但附加(ListTemp,ListSum,ListSum)沒有工作以我想要的方式。
任何人都可以幫我嗎?
乾杯
假設我有一個列表ListSum,我想追加一個新的列表ListSum遞歸,像序言:一個列表追加到自身
appList(ListSum):-
%%generate a list: ListTemp,
append(ListTemp,ListSum,ListSum),
appList(ListSum).
但附加(ListTemp,ListSum,ListSum)沒有工作以我想要的方式。
任何人都可以幫我嗎?
乾杯
你要明白統一的概念(或實際上是「匹配」的序言中實現)。您不能將兩個或更多值綁定到同一個變量。一旦匹配,Prolog中的變量一直持續其價值,直到達到最終目標,或者失敗。在那之後,如果有更多的可能性,那麼該變量會用另一個值重新實例化,依此類推。
例如,如果我查詢APPLIST([]),然後追加將被測試,以作爲匹配:
append(ListTemp,[],[])
如果ListTemp不是空的列表中,該子句將失敗,因爲語義追加的是「用第二個參數附加第一個參數,兩個都是列表,導致第三個」。對appList(ListSum)
的遞歸調用將被稱爲appList([])
,因爲ListSum先前與[]匹配,導致無限遞歸(幸運的是,如果ListTemp不是[],則不會到達)。
在子句中必須有兩個參數,其中一個是原始列表,另一個是結果列表。 append的前兩個參數是ListSum和ListTemp(取決於你想要的追加順序),而第三個是結果列表。完成,不需要遞歸。
這裏有一個非遞歸的解決方案,不知道爲什麼你甚至不需要遞歸:
appself(L,X) :- append(L,L,X).
感謝您的回答,但我還挺需要使用遞歸,因爲我不知道有多少ListTemp將產生然而。 – SamChen
謝謝,我想我明白你現在說的話。 – SamChen
你會介意給大拇指嗎? – LeleDumbo