пролог, пользовательское меню кофе - PullRequest
0 голосов
/ 18 ноября 2018

Я новичок в курсе Пролог, я пытаюсь написать код, позволяющий пользователю выбрать кофе, затем задать горячий или холодный, а затем размер кофе для расчета цены. Я искал в Интернете объяснения о том, как разработать программу, но я чувствую, что она отличается от того, что мне нужно в примере: [идентификация животных] [1]. Не могли бы вы помочь мне написать меню кофе.

Вот что я пробовал.

  go :- hypothesize(Coffee),
  write('Your order is : '),
  write(Coffee),
  write('and the price for your order =  : ')
  nl,
  undo.

    /* hypotheses to be tested */
  hypothesize(moca)   :- moca, !.
  hypothesize(hotChocolate)     :- hotChocolate, !.
  hypothesize(latte)   :- latte, !.
   hypothesize(cappuccino)     :- cappuccino, !.

  /*   rules */
  moca :-
      /* ask if you want hot or cold
       * ask the size of the coffee*/

Является ли мой метод правильным или лучше создать список, а затем пользователь выбирает по типу названия кофе?

добавить меню вот так

    menu :- repeat,
    write('pleaase, Choose the Coffe to order:'),nl,
    write('1. Moca'),nl,
    write('2. Latte'),nl,
    write('3. Hot Choclate'),nl,

    write('Enter your choice number please: '),nl,
    read(Choice),
    run_opt(Choice).

1 Ответ

0 голосов
/ 19 ноября 2018

Вот что-то простое.

Сначала вам нужна таблица опций и цен, но в Прологе это можно сделать просто как факты.

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