Как я могу показать максимальное количество - PullRequest
0 голосов
/ 16 апреля 2019

Я знаю, мой вопрос будет звучать глупо для вас. Просто я не могу получить этот язык, потому что он сильно отличается от языков, которые я знаю. Мне нужно взять максимальное количество предсказаний рейтинга, но я не знал, как это сделать. Всякий раз, когда я занимаюсь исследованиями, появляются списки, а рейтинг - не список. Вот мой код:

movie(name(thedarknight),director(christopher),
         [starring(magijelnar,10000),starring(aroneikhart,30000)],
         rating(9)).
movie(name(shazam),director(david),
         [starring(markstrong,1000),starring(jackdaniel,3000)],
         rating(7)).

и еще что-то, правильно ли я делаю матрицу?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

библиотека ( solution_sequence ) была недавно введена в SWI-Prolog:

?- order_by([desc(X)],movie(name(N),_,_,rating(X))).
X = 9,
N = thedarknight ;
X = 7,
N = shazam.
1 голос
/ 16 апреля 2019

Этот предикат получит название фильма и его рейтинг из структуры:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...