The syntax error results from the fact that the first two clauses have no body.
To answer your question, observe that the maximum of a list can be defined inductively as follows:
- The maximum of a list with one element is that element.
- The maximum of a list with multiple elements is the largest of the head and the maximum of the tail.
Thus,
max_list([H], H).
max_list([H|T], M2) :-
max_list(T, M),
M2 is max(H, M).
This code uses max/2
(SWI-Prolog, GNU-Prolog). Note that most or all Prolog implementations will have a built-in function max_list/2
(S, G), so there is actually no need to define it yourself.
Edit: Bakore notes that a tail recursive implementation may be more efficient. You can do this by defining a predicate max_list/3
which takes an additional argument C
, namely the largest value seen so far.
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).