【问题标题】:find minimum of list inside list on the basis of one value根据一个值在列表中找到列表的最小值
【发布时间】:2021-02-22 19:05:02
【问题描述】:

我在序言中有这个列表

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

我想计算列表的最小值,使得答案应该是

[[dublin, london], 1000]

这个问题有一些类似的问题minimum in list of lists in prolog

但这似乎不起作用,我得到的输出是假的。请帮忙

【问题讨论】:

  • 请注意,在答案的顶部,作者写道:“首先,切换到更好的数据表示:使用[Key,Value],而不是Key-Value” .
  • 我只是在看教程和阅读答案,关于prolog在线可用的东西并不多,我真的不知道如何获取那种形式的数据:(

标签: prolog


【解决方案1】:

这是我的方法:

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]

【讨论】:

    【解决方案2】:

    尝试库(聚合):

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

    参见此处:

    可回溯谓词上的聚合运算符
    https://www.swi-prolog.org/pldoc/man?section=aggregate

    【讨论】:

      【解决方案3】:
      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] .
      
      ?- 
      */
      

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2011-04-27
        • 2017-09-15
        • 2021-07-25
        • 2021-07-28
        • 2016-09-04
        • 2013-11-21
        • 2015-11-28
        • 1970-01-01
        相关资源
        最近更新 更多