Пролог запросить, чтобы найти самый большой элемент в базе данных? - PullRequest
0 голосов
/ 29 октября 2010

Если я определил все цифры в базе данных Prolog, например, dig(0), dig(1), ..., dig(9).Какой запрос я могу использовать для Пролога, чтобы вернуть наибольшую цифру - в данном случае, 9?

Я пробовал что-то вроде:

?- dig(N), dig(M), N > M.

Но это просто возвращает первую возможность, а ненаибольшее число.

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Хотя самым коротким решением, вероятно, является:

?- dig(Max), \+((dig(X), X > Max)).

, концептуально простейшим решением может быть:

?- findall(X, dig(X), Digits), max_list(Digits, Max).

Но посмотрите Макс. Значений, определенных в прологах для большего количества решений, с лучшими и худшими сложностями.

Вы можете проверить скорость этих двух решений, посмотрев этот файл:

:- between(1, 12345, X), assert(dig(X)), fail ; true.

:- time((findall(X, dig(X), Digits), max_list(Digits, Max))),
       write('Findall max: '), write(Max), nl.

:- time((dig(Max), \+((dig(X), X > Max)))), write('\\+ max: '), write(Max), nl.

На моем 5-летнем ноутбуке это ясно показываетчто findall -версия намного быстрее, если у вас есть, например, 12345 записей в вашей базе данных.

% 37,085 inferences, 0.05 CPU in 0.06 seconds (87% CPU, 741700 Lips)
Findall max: 12345
% 76,230,375 inferences, 60.94 CPU in 72.30 seconds (84% CPU, 1250909 Lips)
\+ max: 12345
1 голос
/ 29 октября 2010

Чтобы узнать наибольшее число, вы должны написать соответствующий запрос, а именно:

  • Создание цифры

  • Проверяет, является ли этоцифра самая большая (то есть никакая другая цифра больше)

Так что вы можете написать что-то вроде:

largest(N):-
    dig(N),
    not((
        dig(M),
        M > N
    )).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...