我想用prolog对电影列表进行排序。我有以下电影列表,其中第一个数字是电影的长度,第二个数字是年龄分级,第三个是电影1-10的分级:
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).
]).我希望有一个像sortMoviesByRank( list,Sort)这样的谓词,这样我就可以得到一个从前到后具有最高排名的电影列表。
发布于 2021-11-28 17:29:42
首先,您必须使用逗号分隔列表中的元素。
db([movie("District 9",
[actor("Copley","Sharlto"), actor("James","David")],
[genre("Science-Fiction")],
112, 13, 10) , % <== use comma!
movie("The Matrix",[actor("Reeves","Keanu")],
[genre("Science-Fiction"),genre("Action")],
136,13,10) , % <== use comma!
...]).其次,不清楚movie/6术语中的哪个参数表示电影的排名。因此,为简单起见,请考虑以下数据库,其中元素的格式为movie(Title, Rank)
simpler_db([
movie("District 9", 5),
movie("The Matrix", 1),
movie("Shutter Island", 9),
movie("Gladiator", 7),
movie("The Fault In Our Stars", 8)]).要获得从前到后排名最高的电影列表,可以使用谓词sort/4
?- simpler_db(DB), sort(2, @>=, DB, List).
DB = [movie("District 9", 5), movie("The Matrix", 1),
movie("Shutter Island", 9),
movie("Gladiator", 7),
movie("The Fault In Our Stars", 8)],
List = [movie("Shutter Island", 9),
movie("The Fault In Our Stars", 8),
movie("Gladiator", 7),
movie("District 9", 5),
movie("The Matrix", 1)].目标sort(2, @>=, DB, List)按照参数2 (即Rank)的降序(@>=)对列表DB的元素进行排序,保留副本,生成List作为结果。
编辑要对术语列表进行排序,您需要一个sort(+Key, +Order, +List, -Sorted)形式的目标,其中Key是必须用作排序关键字的术语参数的编号。因此,如果电影由movie(Title, Actors, Genre, Length, Age, Rating)形式的术语表示,并且您希望按参数Rating (这是表示电影的术语的第6个参数)进行排序,那么您可以问:
?- db(DB), sort(6, @>=, DB, List).https://stackoverflow.com/questions/70145323
复制相似问题