Пролог - Рекурсивный доступ к элементу списка списка и получение общей суммы - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь создать запрос average(X, A), который возвращает истину, если X существует в базе данных пролога и если A - это средняя цена товаров в магазине

Пример вывода

?- average(best_smoothies,A).
A = 2.66667
No

База данных Prolog

store(best_smoothies, [alan,john,mary],
      [ smoothie(berry, [orange, blueberry, strawberry], 2),
        smoothie(tropical, [orange, banana, mango, guava], 3),
        smoothie(blue, [banana, blueberry], 3) ]).

store(all_smoothies, [keith,mary],
      [ smoothie(pinacolada, [orange, pineapple, coconut], 2),
        smoothie(green, [orange, banana, kiwi], 5),
        smoothie(purple, [orange, blueberry, strawberry], 2),
        smoothie(smooth, [orange, banana, mango],1) ]).

store(smoothies_galore, [heath,john,michelle],
      [ smoothie(combo1, [strawberry, orange, banana], 2),
        smoothie(combo2, [banana, orange], 5),
        smoothie(combo3, [orange, peach, banana], 2),
        smoothie(combo4, [guava, mango, papaya, orange],1),
        smoothie(combo5, [grapefruit, banana, pear],1) ]).

Моя попытка:

numSmoothie([_|T],X) :- numSmoothie(T,A), X is A+1.
numSmoothie([], 0).

priceSmoothie([_|T],X) :- priceSmoothie(T,A), X is A+1.
priceSmoothie([], 0).

average(X, A) :-    store(X,_,S),
                    numSmoothie(S, SmoothieCount),
                    writeln("Number of smoothies is: "),
                    writeln(SmoothieCount),
                    store(_,_,[smoothie(_,_,C)]),
                    priceSmoothie(C, SmoothiePrice),
                    writeln("Total price of smoothies is: "),
                    writeln(SmoothiePrice),
                    A is SmoothiePrice / SmoothieCount.

Я могу получить количество элементов в списке, просто посчитав на S. Однако я могу Похоже, что у меня нет доступа к элементам списка (также известным как цена) и суммировать их в целом.

Вывод, который я получаю

?- average(smoothies_galore, A).
Number of smoothies is:
5
false.

На основе на выходе ясно, что я не обращаюсь к элементу цены магазина. Почему store(_,_,[smoothie(_,_,C)]) недействительно для доступа к ценам на товары?

Буду признателен за любую помощь по этому поводу. Большое спасибо!

1 Ответ

1 голос
/ 07 мая 2020

Исходя из вывода, ясно, что я не получаю доступ к элементу цены магазина
. Почему store(_,_,[smoothie(_,_,C)]) недействителен, чтобы
мог получить доступ к ценам на товары?

Это будет объединено только с магазином только с одним гладким ie.

т.е. если вы добавите:

store(single_smothie_shop, [p1,p2,p3], [ smoothie(berry, [orange, blueberry, strawberry], 2)]). в свою КБ, тогда запросите:

?-store(What,_,[smoothie(_,_,C)]). C = 2, What = single_smothie_shop.

Это единственный результат этого запроса.

Вы можете получить желаемое с помощью запроса:

?-store(Store,_,Smothies), aggregate(r(count,sum(Price)),S^N^member(smoothie(S,N,Price),Smothies),r(Count,TotalPrice)), Average is TotalPrice/Count.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...