С этими тремя фактами в базе данных, используя bagof
, продает за запись на автора:
?- bagof(Sold, Title^City^book(Author, Title, City, Sold), Sales).
Author = 'Authone',
Sales = [235, 225] ;
Author = 'Authtwo',
Sales = [135].
Теперь вы можете суммировать продажи, чтобы получить общее количество и собрать их с помощью внешнего bagof
:
?- 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)
для этого. Тогда это выглядит так:
?- aggregate(sum(Sold), City^Title^book(Author, Title, City, Sold), Total).
Author = 'Authone',
Total = 460 ;
Author = 'Authtwo',
Total = 135.