2013-05-01 89 views
-2

好的,我有一个表格列表:Prolog搜索子列表的特定元素

myprg(X)。 X = [[a,b,c],[d,e,f],[g,h,i],[j,k,l]]。

即列表中的子列表。

我想在子列表中显示具有“g”作为第一个元素的LAST元素。 答案是“我”

回答

0

要腼腆,这里有一个解决方案:

find_i([_,_,[g,_,i]|_], i). 

这显然适用于你给的情况。或者,我们可以使它不那么具体:

find_i([_,_,[g,_,X]|_], X). 

这里有一个稍微好一点的一个实际执行一些搜索:

find_i([[g,_,X]|_], X). 
find_i([_|Rest],X) :- find_i(Rest,X). 

当然,它假定列表中的将只有一个项目。这是另一个稍微好一点的:

find_i([[g|Rest]|_], X) :- append(_, [X], Rest). 
find_i([_|Rest],  X) :- find_i(Rest, X). 

为什么我们要搜索g?也许我们应该拉他们赶出自己的变量:

find_i(G, [[G|Rest]|_], X) :- append(_, [X], Rest). 
find_i(_, [_|Rest],  X) :- find_i(Rest, X). 

这一个你查询像这样:find_i(g, [[a,b,c],[d,e,f],[g,h,i],[j,k,l]], X)

更好的方法是分离出找到子列表并获取列表的最后一个元素。通常在编程时,它有助于将事情分解成像这样的组成部分并干净地解决它们。就像这样:

last(L, X) :- append(_, [X], L). 

find_by_first(G, [[G|Rest]|_], [G|Rest]). 
find_by_first(G, [_|Rest],  Sublist) :- find_by_first(G, Rest, Sublist). 

find_i(G, L, X) :- find_by_first(G, L, Sublist), last(Sublist, X). 

下一次,你应该一定要包括你的名字和你的教授的姓名和电子邮件地址和/或作业提交URL。在家庭作业中发送也很困难,我们很乐意提供帮助。