Вот что-то простое.
Сначала вам нужна таблица опций и цен, но в Прологе это можно сделать просто как факты.
price(moca,2.0).
price(hotChocolate,1.5).
price(latte,2.5).
price(cappuccino,3.0).
price(cold,0.1).
price(hot,0.5).
price(short,1.0).
price(tall,1.5).
price(grande,2.0).
price(venti,2.5).
price(trenta,3.0).
Далее вам нужно определиться саргументы для предиката, в данном случае это просто, список опций для ввода и цена для вывода.
coffeeOrder(Options,Price)
Поскольку существует список опций, код должен обрабатывать списоки один из самых простых способов для новичка - использовать рекурсивный вызов.Рекурсивный набор предикатов следует шаблону базового случая
% Do something when the list is empty.
coffeeOptions([], ... ).
и предикату для обработки рекурсивной обработки списка
% Do something when the list is not empty.
coffeeOptions([H|T],PriceIn,PriceOut) :-
% do something with the head, H
coffeeOptions(T,NewPrice,PriceOut).
При генерации значения, в данном случае окончательной ценыи при использовании рекурсивного вызова часто требуется вспомогательный предикат для установки начального значения, в этом случае начальная стоимость равна 0,0.
Итак, предикаты:
coffeeOrder(Options,Price) :-
coffeeOptions(Options,0.0,Price). % This sets the initial price to 0.0.
% Do something when the list is empty.
coffeeOptions([],Price,Price).
% Do something when the list is not empty.
coffeeOptions([Option|T],Price0,Price) :-
price(Option,Cost),
Price1 is Price0 + Cost,
coffeeOptions(T,Price1,Price).
И быстрый тест.
?- coffeeOrder([moca,hot,grande],Price).
Price = 4.5.
Весь код в одном фрагменте.
coffeeOrder(Options,Price) :-
coffeeOptions(Options,0.0,Price).
coffeeOptions([],Price,Price).
coffeeOptions([Option|T],Price0,Price) :-
price(Option,Cost),
Price1 is Price0 + Cost,
coffeeOptions(T,Price1,Price).
price(moca,2.0).
price(hotChocolate,1.5).
price(latte,2.5).
price(cappuccino,3.0).
price(cold,0.1).
price(hot,0.5).
price(short,1.0).
price(tall,1.5).
price(grande,2.0).
price(venti,2.5).
price(trenta,3.0).