gANDALF
gANDALF

Reputation: 238

find minimum of list inside list on the basis of one value

I have this list in prolog

[[[dublin, london], 1000], [[dublin, moscow, london], 5000]]

And I want to calculate the minimum of the list such that answer should be

[[dublin, london], 1000]

This question has some similar problem minimum in list of lists in prolog

But that doesn't seems to working I am getting output as false. Please help

Upvotes: 2

Views: 160

Answers (3)

Reema Q Khan
Reema Q Khan

Reputation: 878

Here's my approach:

min([X],X).
min([H|T],Min):-
    min(T,TMin),
    H>TMin,
    Min is TMin.
min([H|T],Min):-
    min(T,TMin),
    H=<TMin,
    Min is H.

minlist(List,Result):-
    findall(Value, member([_,Value],List),VList),
    min(VList,Min),
    findall(EList,member([EList,Min],List),L),
    append(L,[Min],Result).

?- minlist([[[dublin, london], 1000], [[dublin, moscow, london], 5000]],Result)
Result = [[dublin, london], 1000]

Upvotes: 1

user502187
user502187

Reputation:

Try library(aggregate):

?- aggregate_all(min(X,Y), 
       member([Y,X], [[[dublin, london], 1000], 
                      [[dublin, moscow, london], 5000]]), 
       R).
R = min(1000, [dublin, london]).

See also here:

Aggregation operators on backtrackable predicates
https://www.swi-prolog.org/pldoc/man?section=aggregate

Upvotes: 3

Kintalken
Kintalken

Reputation: 783

list_min([],[]) .

list_min([ITEM|ITEMs],MIN)
:-
list_min(ITEMs,ITEM,MIN)
.

list_min([],MIN,MIN) .

list_min([ITEM|ITEMs],MIN0,MIN)
:-
item_min(MIN0,ITEM,MIN1) ,
list_min(ITEMs,MIN1,MIN)
.

item_min(TERM_A,TERM_B,MIN)
:-
TERM_A=[CITIES_A,DISTANCE_A] ,
TERM_B=[CITIES_B,DISTANCE_B] ,
prolog:compare(COMPARE,DISTANCE_A,DISTANCE_B) ,
item_min(COMPARE,TERM_A,TERM_B,MIN) .
.

item_min('<',TERM_A,TERM_B,TERM_A) .
item_min('=',TERM_A,TERM_B,TERM_A) .
item_min('>',TERM_A,TERM_B,TERM_B) .
/*
?- Xs=[[[dublin,london],1000],[[dublin,moscow,london],5000]] , list_min(Xs,MIN) .
Xs = [[[dublin,london],1000],[[dublin,moscow,london],5000]] ,
MIN = [[dublin,london],1000] .

?- Xs=[[[dublin,london],1000],[[dublin,moscow,london],5000],[[a,b],200]] , list_min(Xs,MIN) .
Xs = [[[dublin,london],1000],[[dublin,moscow,london],5000],[[a,b],200]] ,
MIN = [[a,b],200] .

?- Xs=[[[dublin,london],1000],[[a,b],200],[[dublin,moscow,london],5000]] , list_min(Xs,MIN) .
Xs = [[[dublin,london],1000],[[a,b],200],[[dublin,moscow,london],5000]] ,
MIN = [[a,b],200] .

?- 
*/

Upvotes: 1

Related Questions