Несмотря на то, что Крис не знаком с Прологом, подход, который он изложил, может быть более эффективным способом поиска информации с максимальной оценкой, чем у мата. Вместо квадратичного числа сравнений возможен подход, подобный Крису, который линейно сканирует возможные входные данные.
Здесь maxScoreOfList / 3 вернет лучший элемент Z и лучший результат B для списка допустимых входных данных в качестве третьего аргумента. Предикат потерпит неудачу в пустом списке.
maxScoreOfList(Z,B,[H|T]) :-
scoreFromInput(H,S),
maxScoreOfListAux(Z,B,H,S,T).
Требуется «вспомогательная» функция, как показано ниже, которая иллюстрирует «хитрость» добавления некоторых дополнительных аргументов, чтобы при достижении конца списка ввода выходы Z и B можно было связать с лучшим элементом и оценкой. найдено "пока":
maxScoreOfListAux(Z,B,Z,B,[ ]).
maxScoreOfListAux(Z,B,X,S,[H|T]) :-
scoreFromInput(H,Q),
( S >= Q
-> ( Y = X, R = S )
; ( Y = H, R = Q )
),
maxScoreOfListAux(Z,B,Y,R,T).