2013-02-10 52 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