如何在Prolog中对列表排序:按评分降序排列电影列表
Prolog 电影列表按评分降序排序实现
实现思路
- 自定义比较谓词,提取两个电影结构的第6位评分字段,交换比较顺序实现降序规则
- 调用Prolog内置的
predsort/3谓词,传入自定义比较规则完成列表排序
完整代码
% 电影数据集(已修正原列表内元素分隔的语法错误) db([ movie("District 9",[actor("Copley","Sharlto"),actor("James","David")], [genre("Science-Fiction")],112,13,10), movie("The Matrix",[actor("Reeves","Keanu")],[genre("Science-Fiction"),genre("Action")],136,13,10), movie("Shutter Island",[actor("Dicaprio","Leonardo")],[genre("Drama")],136,16,8), movie("Gladiator",[actor("Crowe","Russel")],[genre("Drama")],90,16,10), movie("The Fault In Our Stars",[actor("Woodley","Shalaine")],[genre("Drama")],126,13,8) ]). % 自定义评分降序比较规则 compare_movie_rank(Order, movie(_,_,_,_,_,Rank1), movie(_,_,_,_,_,Rank2)) :- % 交换两个评分的比较顺序实现降序 compare(Order, Rank2, Rank1). % 需求要求的排序谓词 % List:输入待排序的电影列表,Sorted:输出按评分降序排列的结果 sortMoviesByRank(List, Sorted) :- predsort(compare_movie_rank, List, Sorted).
使用示例
% 从数据库取出所有电影并排序 ?- db(Movies), sortMoviesByRank(Movies, SortedList).
补充说明
返回结果中评分相同的电影相对顺序由Prolog内置排序逻辑决定,如果你需要在评分相同时按其他字段(比如时长、名称)做二次排序,只需要修改compare_movie_rank的比较逻辑即可。
内容的提问来源于stack exchange,提问作者noobmaster69
相关产品推荐
相关产品推荐

