Сумма различных элементов в динамическом списке и составление по убыванию - PullRequest
1 голос
/ 15 мая 2019

Итак, у меня есть это домашнее задание, и основная идея состоит в том, чтобы симулировать продажу книг.У меня есть: - динамическая книга / 4.Книга ( 'Автор', 'Название', 'Город', в продаже).в моем файле данных.У автора может быть более 1 книги, и 1 книга может быть продана в нескольких городах. Мне удалось смоделировать покупку книг.Моя проблема заключается в том, что я должен выписать автора бестселлеров и города-бестселлеры на основе общих продаж, а также составить нисходящий список, в котором будет записан автор, название, продажи в порядке убывания на основе продаж.

Я пытался использовать методы 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 Ответ

1 голос
/ 16 мая 2019

С этими тремя фактами в базе данных, используя 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...