所以我有这个作业,基本思想是模拟销售书籍。 我有:-动态书/ 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本书,而且在统计代码中,我想按降序写出该列表特价出售。 谢谢您的提前帮助。
答案 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)