GC делает большую оптимизацию на том, когда правильно завершить вещи.
Поэтому, если Вы не знакомы с тем, как GC на самом деле работает и как он отмечает поколения, вручную вызов завершает или запускается, GC'ing, вероятно, повредит производительность, чем справка.
Как и вы, я использую имя «max» для предиката. Эта реализация не полагается на какой-либо встроенный предикат:
max([X],X).
max([X|Xs],X):- max(Xs,Y), X >=Y.
max([X|Xs],N):- max(Xs,N), N > X.
Синтаксическая ошибка возникает из-за того, что первые два предложения не имеют тела.
Чтобы ответить на ваш вопрос, обратите внимание, что максимум списка может быть определен индуктивно следующим образом:
Таким образом,
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).