如何显示最大数量

时间:2019-04-16 09:28:54

标签: prolog

我知道我的问题对您来说很傻。我无法使用这种语言,因为它与我所知道的语言有很大不同。我需要采用评分预测的最大值,但是我不知道该怎么做。每当我进行研究时,出现的都是列表,而评分不是列表。这是我的代码:

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 个答案:

答案 0 :(得分:1)

此谓词将从结构中获取电影的名称及其等级:

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.

答案 1 :(得分:1)

library(solution_sequences)最近已在SWI-Prolog中引入:

?- order_by([desc(X)],movie(name(N),_,_,rating(X))).
X = 9,
N = thedarknight ;
X = 7,
N = shazam.