2015-06-12 261 views
2

假設我有列表Xs = [a,b,c]. 現在我想遍歷所有元素並調用此元素的另一個函數。我的問題是:如何使用頭部和尾部做到這一點?我會很感激的幫助。Prolog遍歷列表

+0

對於一件事地圖是你的朋友 – therealprashant

回答

6

通常,您不會在Prolog中進行迭代。取而代之的是,你寫的規則與一對遞歸條款的,就像這樣:

dosomething([]). 
dosomething([H|T]) :- process(H), dosomething(T). 

第一句加工基地的情況下,當列表[]是空的。在這種情況下,沒有什麼可做的,所以規則的主體也是空的。

第二個子句處理您的列表中至少有一個元素的情況。語法[H|T]與您的列表相結合,H成爲列表的頭,T成爲其尾部。例如,如果您處理dosomething([a,b,c]),H變爲a,並且T變爲[b,c]

這條規則的主體有兩部分。第一部分在頭上操作,在其上呼叫process。這是您要爲列表的每個元素執行的規則。第二部分在列表的尾部遞歸地調用dosomething規則。當尾部列表不爲空時,dosomething的第二個子句將與較短的列表一起繼續處理。當尾部列表爲空時,第一個子句將統一,從而結束處理。

+5

雖然這個答案是正確的,但它是非常20世紀70年代。與此同時,['maplist(process,[a,b,c])'](http://stackoverflow.com/a/30759136/772868)和['maplist/3','maplist/4 '...](http://stackoverflow.com/a/6683502/772868) – false

+2

@false你是對的。然而,OP想知道「如何使用頭部和尾部」,所以我解釋了20世紀70年代的做法。我認爲對這個簡單代碼片段的深入理解對於理解Prolog的做事方式非常重要。當然Prolog從業者很快會發現'maplist/2',他們永遠不會回頭。 – dasblinkenlight

+2

儘管我們在這裏回答提出的問題,但這些問題通常包含更好的被忽略的部分。 – false