Этот предикат получит название фильма и его рейтинг из структуры:
movierating(Name, Rating) :-
movie(name(Name), _, _, rating(Rating)).
Если вы хотите получить максимальный рейтинг, самый простой и наименее эффективный способ сделать это, это сказатьЯ получил рейтинг X, и нет рейтинга Y, который больше X. Таким образом, X является максимумом.В коде это выглядит так:
highest_rating(Rating) :-
movie(_, _, _, rating(Rating)),
\+ (movie(_, _, _, rating(OtherRating)),
OtherRating > Rating).
Возможно, вы захотите узнать и название фильма, так что вы можете просто добавить это в свой первоначальный запрос:
highest_rated(Movie, Rating) :-
movie(name(Movie), _, _, rating(Rating)),
\+ (movie(_, _, _, rating(OtherRating)),
OtherRating > Rating).
Это будет O (N ^ 2), что может быть слишком неэффективно для вашего вкуса, и в этом случае вам, вероятно, следует использовать findall/3
, чтобы получить все оценки, а затем запросить максимум.Это будет выглядеть так:
?- findall(Rating, movie(_, _, _, rating(Rating)), Ratings),
max_list(Ratings, Rating).
Rating = 9,
Ratings = [9, 7].
Это также возможно с библиотекой (агрегат):
?- aggregate(max(Rating, Movie),
Movie^D^A^movie(name(Movie), D, A, rating(Rating)),
max(Rating, Movie)).
Rating = 9,
Movie = thedarknight.