Пролог, найдите минимум в списке - PullRequest
12 голосов
/ 19 октября 2010

короче: как найти минимальное значение в списке?(спасибо за совет kaarel)

длинная история:

Я создал взвешенный граф в прологе amzi и, имея 2 узла, я могу получить список путей.Однако мне нужно найти минимальное значение в этом пути, но я не могу просмотреть список, чтобы сделать это.Могу ли я попросить вашего совета о том, как определить минимальное значение в списке?

мой код в настоящее время выглядит следующим образом:

arc(1,2).
arc(2,3).
arc(3,4).
arc(3,5).
arc(3,6).
arc(2,5).
arc(5,6).
arc(2,6).

path(X,Z,A) :- 
 (arc(X,Y),path(Y,Z,A1),A is A1+1;arc(X,Z), A is 1).

таким образом, 'вводя findall (Z, путь (2, 6, Z), л) «.в слушатель позволяет мне получить список [3,2,2,1].Мне нужно извлечь минимальное значение отсюда и умножить его на сумму.Может кто-нибудь посоветовать, пожалуйста, как получить минимальное значение?спасибо!

Ответы [ 13 ]

0 голосов
/ 06 мая 2012

Аналогично андерсой, но вместо двойного сравнения используется разрез:

min([X], X).

min([X, Y | R], Min) :-
    X < Y, !,
    min([X | R], Min).

min([X, Y | R], Min) :-
   min([Y | R], Min).
0 голосов
/ 07 декабря 2011
min([Second_Last, Last], Result):-
    Second_Last < Last
 -> Result = Second_Last
 ;  Result = Last, !.

min([First, Second|Rest], Result):-
    First < Second
 -> min([First|Rest], Result)
 ;  min([Second|Rest], Result).

Должно работать.

0 голосов
/ 19 октября 2010

спасибо за ответы. был полезен Я также экспериментировал с Фуртуром и разработал этот ответ:

% if list has only 1 element, it is the smallest. also, this is base case.
min_list([X],X).

min_list([H|List],X) :-
min_list(List,X1), (H =< X1,X is H; H > X1, X is X1).

% recursively call min_list with list and value,
% if H is less than X1, X1 is H, else it is the same. 

Не уверен, как измерить, насколько хорош ответ, это алгоритмически, но это работает! был бы признателен за любые отзывы, тем не менее. спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...