Prolog 如何显示最大值

Prolog 如何显示最大值,prolog,Prolog,我知道我的问题对你来说听起来很傻。只是我不懂这种语言,因为它和我所知道的语言很不一样。我需要获得评级预测的最大值,但我不知道怎么做。每当我做研究时,出现的是列表,而评级不是列表。这是我的密码: movie(name(thedarknight),director(christopher), [starring(magijelnar,10000),starring(aroneikhart,30000)], rating(9)). movie(name(shazam

我知道我的问题对你来说听起来很傻。只是我不懂这种语言,因为它和我所知道的语言很不一样。我需要获得评级预测的最大值,但我不知道怎么做。每当我做研究时,出现的是列表,而评级不是列表。这是我的密码:

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)).

&还有,我做的矩阵对吗

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

movierating(Name, Rating) :-
    movie(name(Name), _, _, rating(Rating)).
如果你想得到最大评级,最直接、最低效的方法就是说,我得到了评级X,没有评级Y大于X。因此,X是最大值。在代码中,如下所示:

highest_rating(Rating) :-
    movie(_, _, _, rating(Rating)),
    \+ (movie(_, _, _, rating(OtherRating)), 
        OtherRating > Rating).
?- findall(Rating, movie(_, _, _, rating(Rating)), Ratings), 
   max_list(Ratings, Rating).
Rating = 9,
Ratings = [9, 7].
您可能也想知道电影的名称,因此可以将其添加到初始查询中:

highest_rated(Movie, Rating) :-
    movie(name(Movie), _, _, rating(Rating)),
    \+ (movie(_, _, _, rating(OtherRating)), 
        OtherRating > Rating).
这将是O(N^2),这可能对您的喜好来说效率太低,在这种情况下,您可能应该使用
findall/3
获得所有评级,然后要求最大值。看起来是这样的:

highest_rating(Rating) :-
    movie(_, _, _, rating(Rating)),
    \+ (movie(_, _, _, rating(OtherRating)), 
        OtherRating > Rating).
?- findall(Rating, movie(_, _, _, rating(Rating)), Ratings), 
   max_list(Ratings, Rating).
Rating = 9,
Ratings = [9, 7].
这也可以通过库(聚合)实现:


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

movierating(Name, Rating) :-
    movie(name(Name), _, _, rating(Rating)).
如果你想得到最大评级,最直接、最低效的方法就是说,我得到了评级X,没有评级Y大于X。因此,X是最大值。在代码中,如下所示:

highest_rating(Rating) :-
    movie(_, _, _, rating(Rating)),
    \+ (movie(_, _, _, rating(OtherRating)), 
        OtherRating > Rating).
?- findall(Rating, movie(_, _, _, rating(Rating)), Ratings), 
   max_list(Ratings, Rating).
Rating = 9,
Ratings = [9, 7].
您可能也想知道电影的名称,因此可以将其添加到初始查询中:

highest_rated(Movie, Rating) :-
    movie(name(Movie), _, _, rating(Rating)),
    \+ (movie(_, _, _, rating(OtherRating)), 
        OtherRating > Rating).
这将是O(N^2),这可能对您的喜好来说效率太低,在这种情况下,您可能应该使用
findall/3
获得所有评级,然后要求最大值。看起来是这样的:

highest_rating(Rating) :-
    movie(_, _, _, rating(Rating)),
    \+ (movie(_, _, _, rating(OtherRating)), 
        OtherRating > Rating).
?- findall(Rating, movie(_, _, _, rating(Rating)), Ratings), 
   max_list(Ratings, Rating).
Rating = 9,
Ratings = [9, 7].
这也可以通过库(聚合)实现:

最近在SWI Prolog中引入了library():

?- order_by([desc(X)],movie(name(N),_,_,rating(X))).
X = 9,
N = thedarknight ;
X = 7,
N = shazam.
最近在SWI Prolog中引入了library():

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

谢谢你回答我,事情不是这样的。我的意思是我想得到两个结构的最大速率。第一个比率是9,第二个比率是7,所以如果你理解我的意思@RanaMohammad,那么查询应该显示9作为最大值。我已经编辑了我的答案,希望现在它能回答你的实际问题:)耶!findall工作thaaanks我试着在编辑器中编写findall代码,它工作了!!我有一个问题,它没有返回电影的名称。我尝试了很多事情,但都没有成功,我做到了!它现在工作得很好!真是太多了!你帮了我很大的忙。谢谢你回答我,事情不是这样的。我的意思是我想得到两个结构的最大速率。第一个比率是9,第二个比率是7,所以如果你理解我的意思@RanaMohammad,那么查询应该显示9作为最大值。我已经编辑了我的答案,希望现在它能回答你的实际问题:)耶!findall工作thaaanks我试着在编辑器中编写findall代码,它工作了!!我有一个问题,它没有返回电影的名称。我尝试了很多事情,但都没有成功,我做到了!它现在工作得很好!真是太多了!你帮了我很大的忙。很酷的图书馆!谢谢你的发帖!我认为完整的解决方案实际上更像是
limit(1,order\u by([desc(Rating)],movie(name(name),\uu,\uu,Rating(Rating))。
不过。非常酷的库!谢谢你的发帖!我认为完整的解决方案实际上更像是
limit(1,order\u by([desc(Rating)],movie(name)(name),u,u,Rating(Rating))。