【问题标题】:Prolog Find Minimum numbers from 2 listsProlog 从 2 个列表中查找最小数字
【发布时间】:2016-03-15 04:29:15
【问题描述】:

我正在尝试从两个列表中找到 2 个最小数字。我可以从一个列表中找到,但是如果第二个最小数字在第二个列表中怎么办。

例如,min_in_list([2,8,7], [5,3,4], M) 应该是M = [2, 3]

下面的代码是一个列表。

min_in_list([Min],Min).                 % We've found the minimum

min_in_list([H,K|T],M) :-
    H =< K,                             % H is less than or equal to K
    min_in_list([H|T],M).               % so use H

min_in_list([H,K|T],M) :-
    H > K,                              % H is greater than K
    min_in_list([K|T],M).               % so use K

【问题讨论】:

  • 最好的办法是有两个最小变量,然后遍历列表并比较两者,在适当的时候替换值。我不是 prolog 人,所以我无法帮助编写代码。
  • 如果你的min_in_list 对一个列表有效,那么你可以使用它两次:min_in_list(L1, L2, [M1, M2]) :- min_in_list(L1, M1), min_in_list(L2, M2). 不过,这似乎是一个奇怪的谓词,它需要硬编码的参数来独立获得最小值两个不同的列表,除非列表之间存在您未提及的其他关系。
  • 我不明白这与分别为每个列表查找最小值有何不同?

标签: prolog minimum


【解决方案1】:

分解是你的朋友。 一般地思考也是如此。在两个列表中的每一个中查找最小值实际上与在任意数量的列表中查找最小值没有什么不同。解决方案不应该比这更复杂:

min_in_list( Xs , Ys , Ms ) :- minimums( [Xs,Ys] , Ms ) .

minimums( []     , [] ) .
minimums( [L|Ls] , [M|Ms] ) :- minimum(L,M) , minimums(Ls,Ms).

minimum( [X|Xs] , M ) :- minimum(Xs,X,M) .

minimum( []     , M , M ) .
minimum( [X|Xs] , T , M ) :- X <  T , minimum(Xs,X,M).
minimum( [X|Xs] , T , M ) :- X >= T , minimum(Xs,T,M).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2011-04-27
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多