Пролог возвращает только максимальное значение из всех итераций - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть метод, который возвращает мне число на всех iterations, но теперь мне нужно вернуть только максимальное значение из всех iterations, которые были сделаны.

find_max(X, Y):-
    find_number(X, Y).

Таким образом, find_number() возвращает только 1 число и текст вместе с ним. Так, например, если бы я запустил его, я бы получил такой вывод:

X = 1, Y = me;
X = 5, Y = you;
X = 6, Y = he;

И единственный выход, который мне нужно вернуть, это X = 6, Y = he;.
Я использую SWI-Prolog.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Более портативная альтернатива library(aggregate), опубликованная Виллемом, так как библиотека доступна только в нескольких системах Prolog:

find_max_alt(Xm, Ym) :-
    setof(max(X, Y), find_number(X, Y), Solutions),
    reverse(Solutions, [max(Xm, Ym)| _]).

Это решение также требует меньшего числа выводов. Используя данные в вопросе, получаем:

?- time(find_max(Xm, Ym)).
% 40 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 800000 Lips)
Xm = 6,
Ym = he.

Versus:

?- time(find_max_alt(Xm, Ym)).
% 25 inferences, 0.000 CPU in 0.000 seconds (76% CPU, 675676 Lips)
Xm = 6,
Ym = he.

Предикат setof/3 является стандартным предикатом. Предикат reverse/2 является общим предикатом списка (и его гораздо проще определить, чем предикаты в библиотеке aggregate.

0 голосов
/ 05 ноября 2018

Для этого вы можете использовать библиотеку aggregate:

:- use_module(library(aggregate)).

find_max(Xm, Ym):-
    aggregate(max(X, Y), find_number(X, Y), max(Xm, Ym)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...