Хотя самым коротким решением, вероятно, является:
?- 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