【问题标题】:How to sort a list in prolog如何在序言中对列表进行排序
【发布时间】:2022-01-05 17:59:15
【问题描述】:

我想对序言中的电影列表进行排序。我有以下电影列表,其中第一个数字是电影的长度,第二个数字是年龄等级,第三个是电影 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) 这样的谓词,这样我就可以得到一个从头到尾排名最高的电影列表。

【问题讨论】:

    标签: list sorting prolog


    【解决方案1】:

    首先,您必须使用逗号分隔列表的元素。

    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, @&gt;=, DB, List) 按参数2(即Rank)的降序(@&gt;=)对列表DB 的元素进行排序,保持重复,生成List 作为结果。

    编辑要对术语列表进行排序,您需要sort(+Key, +Order, +List, -Sorted) 形式的目标,其中Key 是必须用作排序键的术语参数的编号。因此,如果电影由movie(Title, Actors, Genre, Length, Age, Rating) 形式的术语表示,并且您想按参数Rating(这是表示电影的术语的第 6 个参数)进行排序,那么您可以问:

    ?- db(DB), sort(6, @>=, DB, List).
    

    【讨论】:

    • 为了澄清,第三个数字代表排名,第一个数字是长度,然后是年龄等级,然后是等级
    • @noobmaster69 请参阅我的回答中的编辑部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2020-12-23
    • 2019-11-29
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多