我在理解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 :(得分: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.