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