我有一個大列表BIGLIST
,它僅包含任意數量的較小列表SMALLLIST
,它們本身在其第一個索引中包含另一個列表INNERLIST
。我需要設計一個謂詞,可以找到最短的INNERLIST
的SMALLLIST
。沒有INNERLIST
具有的長度大於9例如:Prolog - 查找列表中列表最短的對象列表
BIGLIST = [
[[1,2,3],3824],
[[4,5],89],
[[6],283],
[[2],14],
]
具有最短INNERLIST
的SMALLLIST
這裏是[[6],283]
,儘管[[2],14]
存在(它們是相同的長度)。我寫了一個謂語shortest/2
類似以下,但所需的SMALLLIST
永遠不會被綁定到Shortest
:
shortest(BIGLIST,Shortest) :-
Num = 10,
get_shortest(BIGLIST,Shortest,Num).
get_shortest([],_,_). %list is empty, stop
get_shortest([SMALLLIST|Tail],Shortest,ShortLen) :- %better SMALLLIST found
nth0(0,SMALLLIST,INNERLIST), %get INNERLIST
length(INNERLIST,Len),
Len < ShortLen,
NShortest = SMALLLIST,
NShortLen = Len,
get_shortest(Tail,NShortest,NShortLen),
Shortest = NShortest.
get_shortest([_|T],Shortest,ShortLen) :- %skip head if it is not a better value
get_shortest(T,Shortest,ShortLen).
感謝您的幫助。
你可以這樣做,'setof(N- [L | T],(member([L | T] ,BIGLIST),length(L,N)),S),S = [_-SMALLIST | _]。「但是如果存在」tie「而不是第一個,它會選擇最短的最後一個。 – lurker 2014-10-01 18:16:29
'Head'應該是'SMALLLIST',但是代碼中還有其他缺陷。你有沒有考慮過使用' - >'?如果您只想要頭部,請使用'[INNERLIST | _] = SMALLLIST'。 – 2014-10-01 18:34:49