2013-12-18 120 views
1

的新特性,试图让我的头以递归方式处理列表的列表。在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] ]). 

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

任何指针,将不胜感激。

谢谢!

+0

是这个家庭作业? –

+0

你有什么试过的?有一个错字:items([[12,14,23],[8,16,22],[18,12,14] **)。 – joel76

+0

不是。这与我在过去一个学期错过的问题类似。 – user3115959

回答

4

如果您在相应的部分进行分类,这并不难。在序言中,列表是一个列表,直到你需要对某个元素进行操作。

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

似乎毫无意义地使用累加器,实际上颠倒了原来的订单 – CapelliC

+0

@CapelliC是的,在这种情况下你是对的。这是我想到的第一种方法。你的答案已经覆盖了它(+1),所以我不会编辑。 – lurker

+0

@mbratch ...嗯,它应该是“8皇后问题的四维求解器”。这种方式较不明确。 :)(4D:2行,2列)。 –

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).