2013-02-10 75 views
1

我在理解Prolog中的列表遞歸和修改時有點麻煩。我試圖列出一個列表,然後在每個列表中,將列表中的每個元素與最後一個元素相乘。序言:列表遞歸和修改

這裏是我的代碼片段:

/*Find the last element of a list*/ 
    lastelement(X,[X]). 
    lastelement(X,[_|L]) :- lastelement(X,L). 

    /*Multiply two lists together*/ 
    multiplication(M1,M2,M1*M2). 

    /*Take a list, find the last element and multiply every part of that list by that element*/ 
    /*Attach modified list to X*/ 
    modifyL([],X) :- X is []. 
    modifyL([First|Tset],X) :- lastelement(Y,First), 
    multiplication(Y,First,MFirst), 
    modifyL([Tset],X), 
    append(X,MFirst,X). 

當我嘗試列出的任何名單,但是,我得到的是假的。有人可以給我任何指針 列表遞歸,這可能有助於進一步理解這個問題?

+0

您使用哪個實現? – 2013-02-10 20:46:22

+0

我目前使用SWI Prolog版本5.10 – 2013-02-10 20:47:52

回答

1
modifyL([],X) :- X is []. 

這不會做你認爲,用於獲取算術評估的結果。

你可以寫

modifyL([],X) :- X = []. 

或者乾脆

modifyL([],[]). 

當你一個列表,而且你重複同樣的過程,而這正是設計這個列表,您可以使用MAPLIST的每個元素爲了那個原因。 模板是maplist(目標,L1 L2)。

modify(L1, L2) :- 
    maplist(multiply_one_list,L1, L2). 

multiply_one_list一個列表的作品,你也可以寫成這樣:

multiply_one_list(L_in, L_out) :- 
    % getting last argument 
    reverse(L_in, [Last | _]), 
    % multiply each element of the list by 
    % the last element, one more maplist ! 
    maplist(multiply_one_element(Last), L_in, L_out). 

multiply_one_element(Last, In, Out) :- 
    Out is In * Last. 
+0

非常感謝,這讓我回到了正軌。 – 2013-02-11 00:46:36