Там - это что-то на предыдущие ответы @ aschepler , @ Xonix и @SQB.
В этом ответе мы используем clpfd для выражения декларативной целочисленной арифметики.
:- use_module(library(clpfd)).
Мы определяем largest/2
, используя встроенный предикат member/2
,библиотека мета-предикат maplist/2
и ограничение конечной области (#>=)/2
:
largest(Zs, X) :-
member(X, Zs), % X is a member of the list Zs
maplist(#>=(X), Zs). % all Z in Zs fulfill X #>= Z
Примеры запросов:
?- 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#>=D, X#>=C, X#>=B ;
B = X, X#>=A, X#>=D, X#>=C ;
C = X, X#>=A, X#>=D, X#>=B ;
D = X, X#>=A, X#>=C, X#>=B.