Реализация меню на Prolog

      Комментарии к записи Реализация меню на Prolog отключены

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет назад.

  • Автор
    Сообщения
  • #2174

    questioner
    Участник

    Моя программа должна вести диалог с пользователем посредством иерархического меню.
    На рисунке приведено двухуровневое меню. Программа должна выводить все пункты одного уровня, принимать от пользователя номер пункта и если этот пункт является меню — то выводить его, иначе — выполнять действия в соответствии с выбранным пунктом меню. После выполнения действий, программа повторно выводит меню — до тех пор, пока пользователь не завершит выполнение программы.

    Вложения:
  • #2176

    Функция меню должна вывести список пунктов меню и запросить номер пункта:

    main_menu:-
      write('0 - exit'), nl,
      write('1 - list operations'), nl,
      write('2 - program information'), nl,
      read(Item), main_menu_item(Item).

    При реализации на Turbo Prolog или Visual Prolog необходимо использовать двойные кавычки для строк, а также функцию readInt для ввода целого числа. На SWI Prolog функция read считывает терм, который должен заканчиваться точкой.

    Функция main_menu_item реализует поведение для всех пунктов программы, а также обрабатывает некорректное значение номера пункта:

    main_menu_item(0):-!.
    main_menu_item(1):-
      list_menu, main_menu, !.
    main_menu_item(2):-
      print_info, main_menu, !.
    main_menu_item(_Item):-
      write('bad item number, enter [0-2] please'), nl,
      main_menu.

    Все пункты меню кроме «выход» завершаются рекурсивным вызовом функции main_menu.

    Конкретные пункты и вложенные меню реализуются аналогично:

    list_menu:-
      write('0 - back'), nl,
      write('1 - find minimum list element'), nl,
      write('2 - append lists'), nl,
      read(Item), list_menu_item(Item).
    
    list_menu_item(0):-!.
    list_menu_item(1):-
      write('minimum list element'), nl, !,
      list_menu.
    list_menu_item(2):-
      write('append lists'), nl, !,
      list_menu.
    list_menu_item(_Item):-
      write('bad item number, enter [0-2] please'), nl,
      list_menu.
      
    print_info:-
      write('demo program - menu implementation on prolog'), nl.

    Я подставил заглушки вместо операций над списками, которые должна выполнять Ваша программа, т.к., например, для сложения списков необходимо выполнить ввод двух списков — такая операция по-разному реализуется в различных диалектах. На SWI Prolog для этого можно использовать предикат read, т.к. список является термом, но на Turbo Prolog нужно писать для этого отдельную функцию.

Для ответа в этой теме необходимо авторизоваться.