Синтаксическая ошибка возникает из-за того, что первые два предложения не имеют тела.
Чтобы ответить на ваш вопрос, обратите внимание, что максимум списка можно определить индуктивно следующим образом:
- Максимум списка с одним элементом - это элемент.
- Максимум списка с несколькими элементами - это наибольшее из головы и максимальное из хвоста.
Таким образом,
max_list([H], H).
max_list([H|T], M2) :-
max_list(T, M),
M2 is max(H, M).
В этом коде используется max/2
( SWI-Prolog , GNU-Prolog ). Обратите внимание, что большинство или все реализации Prolog будут иметь встроенную функцию max_list/2
( S , G ), поэтому на самом деле нет необходимости определять ее самостоятельно.
Редактировать: Бакоре отмечает , что хвостовая рекурсивная реализация может быть более эффективной. Вы можете сделать это, определив предикат max_list/3
, который принимает дополнительный аргумент C
, а именно наибольшее значение, которое когда-либо наблюдалось.
max_list([H|T], M) :- max_list(T, H, M).
max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).