2013-05-01 41 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。在家庭作業中發送也很困難,我們很樂意提供幫助。