0

我使用 findall 谓词

findall(A,getzoo(B,A),MyList)

返回此列表

A = [[[ant,bear,crab,tortoise,lion],230], [[lion,tiger,bear],560], [[platypus,tiger,snake],3500], [[hippo,giraffe,snail,emu,condor],30], [[bat,robin,hawk,ape,macaw],100]]

我需要从列表中返回最小值,即Min = [hippo,giraffe,snail,emu,condor],30]

而且我的 min 谓词在直接列表上运行良好。

minList([H],H).  
minList([H|T],Min):-  minList(T,Next),  (H<Next, Min=H; H>=Next, Min=Next)

.

我在尝试解析结构时遇到问题 [[[List],Number],[[List],Number],[[List],Number],...] 并且无法隔离数字。

这是我一直在寻找的答案。

findVal([[H,Val]|T],Val).
findVal([H|T],Out) :- findVal(T,Out).
4

1 回答 1

0

由于您的列表项是双元素列表,因此您必须编写一个与这些列表相结合并将变量绑定到第二个元素的模式。IE,

[_, Y]

为单个元素检索其第二个元素并调用它Y

那么,递归子句 forminList将变为

minList([[X, Y] | T], Min) :-
    minList(T, MinT),
    % now pick apart MinT and compare Y with its right half

或者

minList([H | T], Min) :-
    H = [X, Y],
    % proceed as before
于 2012-11-03T19:21:41.317 回答