使用Prolog中的列表列表

时间:2013-12-18 16:16:03

标签: prolog

的新手,试图以递归方式处理列表列表。

说我有一个清单:

prices([20, 20, 40]).

另一个列表(列表):

items([ [12, 14, 23],[8, 16, 22],[18, 12, 14] ]).

我想将价格中的元素附加到项目中的每个列表中:

items([ [12, 14, 23, 20],[8, 16, 22, 20],[18, 12, 14, 40] ]).

我在同时处理单个列表和列表列表时遇到了问题。

任何指针都会受到赞赏。

谢谢!

3 个答案:

答案 0 :(得分:4)

如果你用适当的部分整理它并不太难。在prolog中,列表是一个列表,直到您需要对元素执行某些操作。

item_prices(ItemPrices) :-
    prices(Prices),
    items(ItemLists),
    item_prices(ItemLists, Prices, [], ItemPrices), !.
item_prices([ItemList|ItemLists], [Price|Prices], SoFar, ItemPrices) :-
    append(ItemList, [Price], ItemPrice),  % Assumes the items are lists, price is not
    item_prices(ItemLists, Prices, [ItemPrice|SoFar], ItemPrices).
item_prices(_, _, ItemPrices, ItemPrices).

然后你只需要打电话:

item_prices(ItemPrices).

给予:

ItemPrices = [[18,12,14,40],[8,16,22,20],[12,14,23,20]]

答案 1 :(得分:2)

任何时候你都难以同时处理太多的东西,看看你是否可以separate your concerns并通过辅助谓词单独处理每个东西。

例如,您可以在此处定义add_to_end( Element, List, Newlist)并在主谓词中使用它。

add_to_end( E, [], R):- R = ... .
add_to_end( E, [A|B], R):- R=[A|X], add_to_end( E, B, ...).

当您掌握了该语言的基础知识后,请查看该库中的内容;很可能已经存在一个谓词,它允许你附加两个列表,你可以用某种方式而不是编写你自己的专用版本。毕竟,add_to_end( E, L, R) == append_two_lists(L, [E], ...)

答案 2 :(得分:2)

这是对mbratch回答的修改

item_prices(ItemPrices) :-
    prices(Prices),
    items(ItemLists),
    item_prices(ItemLists, Prices, ItemPrices), !.
item_prices([ItemList|ItemLists], [Price|Prices], [ItemPrice|ItemPrices]) :-
    append(ItemList, [Price], ItemPrice),  % Assumes the items are lists, price is not
    item_prices(ItemLists, Prices, ItemPrices).
item_prices([], [], []).

没有累加器,我们避免颠倒顺序。

当你必须在匹配的列表元素中执行相同的操作时,这是一个使用maplist / 3的解决方案:

items_updated(Us) :-
    items(Is),
    prices(Ps),
    maplist(append_, Is, Ps, Us).
append_(Is, P, R) :- append(Is, [P], R).