Пролог программа, чтобы найти минимум и следующий минимум в списке - PullRequest
3 голосов
/ 20 апреля 2011

Я хочу создать программу пролога, чтобы она могла искать минимальное число в списке, и когда пользователь запрашивает дополнительные решения (используя символ;), программа возвращает следующее минимальное число. Если пользователь запрашивает другое решение, он возвращает следующий номер и так далее. Я создал минимальный предикат, но не могу отменить его, чтобы получить больше результатов, помогите.

Заранее спасибо.

P.S. Я использую Swi-пролог

Ответы [ 2 ]

2 голосов
/ 05 августа 2015

Мы определяем list_nextmin_gt/3 на основе list_minnum/2, tfilter/3 и dif/3:

list_nextmin_gt(Zs0, M, Zs) :-
   list_minnum(Zs0, M0),
   tfilter(dif(M0), Zs0, Zs1),
   (  M0 = M, 
      Zs = Zs1
   ;  list_nextmin_gt(Zs1, M, Zs)
   ).

Пример запроса:

?- list_nextmin_gt([3,2,1,2,3], M, Rest).
(  M = 1, Rest = [3,2,2,3]
;  M = 2, Rest = [3,3]
;  M = 3, Rest = []
;  false
).

Или, если вас не интересуют остальные пункты списка, просто напишите:

?- list_nextmin_gt([3,2,1,2,3], M, _).
(  M = 1
;  M = 2
;  M = 3
;  false
).
0 голосов
/ 14 мая 2011

Совершенно простое решение: сортируйте список и возвращайте каждого члена этого списка:

min(List, Min) :-
    sort(List, Sorted),
    member(Min, Sorted).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...