2015-12-09 3 views
0

Я пытаюсь найти 2 минимальных числа из двух списков. Я могу найти из одного списка, но что, если второе минимальное число во втором списке.Пролог Найти минимальные цифры из 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 
+0

Лучше всего было бы иметь два минимальные переменные, а затем перебирать списки и сравните как, заменяя значения, когда это необходимо. Я не пролог, поэтому я не могу помочь в кодировании. –

+0

Если ваш 'min_in_list' работает для одного списка, вы можете использовать его дважды:' min_in_list (L1, L2, [M1, M2]): - min_in_list (L1, M1), min_in_list (L2, M2). подобно нечетному предикату, тем не менее, у него были бы жестко закодированные аргументы, чтобы независимо получать минимальные значения из двух разных списков, если нет других отношений между списками, которые вы не упомянули. – lurker

+1

Я не понимаю, как это отличается от поиска минимума для каждого списка отдельно? –

ответ

0

Распад ваш друг здесь. Так думает в общем. Поиск минимального значения в каждом из двух списков действительно не отличается от поиска минимального значения в любом количестве списков. Решение не должно быть более сложным, чем это:

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).