动态列表中不同元素的总和,并形成降序列表

时间:2019-05-15 19:46:18

标签: prolog

所以我有这个作业,基本思想是模拟销售书籍。 我有:-动态书/ 4。 图书(“作者”,“标题”,“城市”,销售)。在我的dat文件中。 作者可以有一本以上的书,并且一本书可以在多个城市出售。我能够模拟购书。 我的问题是我必须根据总销售额写出最畅销的作者和最畅销的城市,并且还要创建一个降序列表,以便根据销售额按降序写出作者,标题,销售额。

我尝试使用findall和forall方法,但无法使其那样工作。

bestsellingauthor:- book(_,_,_,Sale), max(Eladas,All),
    writef('Most popular author is:\n'),
    forall(book(Auth,_,_,All), writef('%w - %w-db\n',[Auth,All])),menu.

stat:- forall(book(Auth,Title,_,Sale),(
              Sale > 0,
        writef('%w - %w - \t%w db \n',[Auth,Title,Sale]))).

因此,基本上,我希望能够获得一位作者的全部销售,该作者可能有或可能不多于1本书,而且在统计代码中,我想按降序写出该列表特价出售。 谢谢您的提前帮助。

1 个答案:

答案 0 :(得分:1)

使用String,利用数据库中的这三个事实,每个作者的每条条目的销售量:

bagof

您现在可以对出售的商品求和,以获取总计,并使用外部?- bagof(Sold, Title^City^book(Author, Title, City, Sold), Sales). Author = 'Authone', Sales = [235, 225] ; Author = 'Authtwo', Sales = [135]. 收集这些商品:

bagof

我使用sort的4个参数版本,以便可以反向对第一个参数进行排序。

要获取按作者/标题分组的列表:

?- bagof(Total-Author, Sales^( bagof(Sold, Title^City^book(Author, Title, City, Sold), Sales), sum_list(Sales, Total) ), Totals), sort(1, @>=, Totals, [Total_sold-Author|_]).
Author = 'Authone',
Totals = [460-'Authone', 135-'Authtwo'],
Total_sold = 460.

并按销售量获得降序的图书清单:

?- bagof(Sold, City^book(Author, Title, City, Sold), Sales).

使用?- bagof(Total-book(Author, Title), Sales^( bagof(Sold, City^book(Author, Title, City, Sold), Sales), sum_list(Sales, Total) ), R), sort(1, @>=, R, Result). R = Result, Result = [235-book('Authone', 'Titleone'), 225-book('Authone', 'Titlethree'), 135-book('Authtwo', 'Titletwo')]. 可以使您的生活变得更加轻松。然后像这样:

library(aggregate)
相关问题