2016-11-04 78 views
0

我在理解prolog中的概念时遇到了困难。从Prolog中的列表创建子列表

我有一个序言名单:

MyList = [item(dog,red), item(cat,black), item(rat,gray)]

,我希望创建一个列表的只是颜色,即 [red,black,gray]

目前我已经试过的解决方案是:

getlistcolors([item(_,C)|T], Result) :- 
    getlistcolors(T,Result), 
    append([C],Result,Result). 

getlistcolors([],_). 

我希望能够调用该功能:

?- getlistcolors(MyList, Result). 
Result = [red,black,gray] 

任何帮助表示赞赏。

感谢

+2

'setof(Color,member(item(_,Color),MyList),ColorList).'将给出唯一的排序颜色列表。如果你想字面上的颜色,包括任何重复,'findall(Color,member(item(_,Color),MyList),ColorList)。“ – lurker

回答

2

getlistcolors([], []). 

getlistcolors([item(_,C)|T], [C | Result]) :- 
    getlistcolors(T,Result). 

试试看你能不能追加新发现C色彩搭配

append([C],Result,Result) 

因为你imposign第二表及所附清单是等于。

您应该使用两个不同的变量写

getlistcolors([item(_,C)|T], Result) :- 
    getlistcolors(T,HeadC), 
    append([C],HeadC,Result). 

,但你可以得到在其名字前C效果简单地翻译C作为第二个参数

getlistcolors([item(_,C)|T], [C | Result]) :- 

第二点你的代码错误的头:终端条款不能写为

getlistcolors([], _). 

或第二个参数不与[]统一和reasult成为像

[red,black,gray|_20] 

其中_20是不统一的变量。

+0

Thanks @ Maxx66。这实际上是如何工作的?我明白函数被调用,但是除了当前项目(尾部)'和每个项目,以及空的'结果列表',加上闭合子句'getlistcolors([],[])。',但不要了解'[C |结果]'运行,并作为功能正在退出。 –

+0

@DeanMeehan - '[C |结果]''与[item(_,C)| T]'一模一样。 'getlistcolors/2'被调用到设置结果基地(空列表)的结束语句('([],[])'),接下来每个'C'都有结果。 – max66

1

只是为了解决在潜行者评论一个问题:使用SETOF/3或bagof/3时

,你必须指定查询中涉及的每个变量的“万能量化”,你没兴趣:

?- MyList = [item(dog,red), item(cat,black), item(rat,gray)],setof(Color, P^member(item(P, Color), MyList), ColorList). 
MyList = [item(dog, red), item(cat, black), item(rat, gray)], 
ColorList = [black, gray, red]. 

缺少的量化问题是在inline documentation

一个SWI-Prolog的解决方案bagof部分更好地解释可以利用图书馆的亚勒和应用(包括自动加载,你不必担心,包括它们):

getlistcolors(List, Colors) :- maplist([E,C]>>(E = item(_,C)), List, Colors). 

?- getlistcolors([item(dog,red), item(cat,black), item(rat,gray)],Cs). 
Cs = [red, black, gray].