Previous answers have @aschepler , @Xonix, and @SQB .
In this answer, we use clpfd to express declarative integer arithmetic.
:- use_module(library(clpfd)).
We define largest/2 using the built-in member/2 predicate, the meta-predicate maplist/2 library, and the end-region constraint (#>=)/2 :
largest(Zs, X) :- member(X, Zs), % X is a member of the list Zs maplist(
Request examples:
?- largest([1,2,3,4,5], X). X = 5. ?- largest([1,2,3,4,5,4], X). X = 5 ; false. ?- largest([1,2,3,4,5,5], X). X = 5 ; X = 5. ?- largest([1,2,3,4,5,5,4], X). X = 5 ; X = 5 ; false. ?- largest([A,B,C,D], X). A = X, X