Ответ в теме: Реализация меню на Prolog

      Комментарии к записи Ответ в теме: Реализация меню на Prolog отключены
#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 нужно писать для этого отдельную функцию.