   /* Демонстрация программы, организующей работу с базой */
   /* данных, содержащейся в оперативной памяти.          */
   /* База данных по составу футбольной команды допускает */
   /* следующие операции:                                 */
   /* (1) добавление,                                     */
   /* (2) удаление,                                       */
   /* (3) просмотр данных                                 */ 
   /* --------------------------------------------------- */
   domains
      p_name, t_name, pos, height, college = string
      p_number, weight, nfl_exp            = integer

   facts 
      dplayer (p_name,t_name,p_number,pos,height,weight,
               nfl_exp,college)

   predicates
      nondeterm do_mbase
      nondeterm player (p_name,t_name,p_number,pos,height,weight,
              nfl_exp,college)
      assert_database
      clear_database
      nondeterm menu
      nondeterm process (integer)
      error

   clauses
      /* ----------------------------------------- */
      /* База данных по составу футбольной команды */
      /* ----------------------------------------- */
      player("Dan Marino","Miami Dolphins",13,"QB",
                    "6-3",215,4,"Pittsburgh").
      player("Richart Dent","Chicago Bears",95,"DE",
                    "6-5",263,4,"Tennessee State").
      player("Bernie Kosar","Cleveland Browns",19,"QB",
                    "6-5",210,2,"Miami").
      player("Doug Cosbie","Dallas Cowboy",84,"TE",
                    "6-6",235,8,"Santa Clara").
      player("Mark Malone","Pittsburgh Steelers",16,"QB",
                    "6-4",223,7,"Arizona State").
      /* ----------------------------------------- */
      /* Предикат, запускающий сценарий            */
      /* ----------------------------------------- */ 
      do_mbase:-
         assert_database,
         menu,
         clear_database.
      /* --------------------------------------------- */ 
      /* Операция добавления базы данных в оперативную */
      /* базу данных                                   */ 
      /* --------------------------------------------- */
      assert_database:-
         player(P_name,T_name,P_number,Pos,Ht,Wt,Exp,College),
         assertz(dplayer(P_name,T_name,P_number,Pos,Ht,
                         Wt,Exp,College)),
         fail.
      assert_database.
      /* -------------------------------------------- */
      /* Операция удаления базы данных из оперативной */
      /* базы данных                                  */ 
      /* -------------------------------------------- */
      clear_database:-
         retract(dplayer(_,_,_,_,_,_,_,_)),
         fail.
      clear_database.
      /* ----------------------------------- */
      /* Опции меню                          */
      /* ----------------------------------- */
      menu:- 
         write("\n * * * * * * * * * * * * * * * * "), nl,
         write("1. Добавить игрока в базу данных    "), nl,
         write("2. Удалить игрока из базы данных    "), nl,
         write("3. Просмотр сведений об игроке      "), nl,
         write("4. Выдача списка всех игроков из БД "), nl,
         write("5. Выход из программы               "), nl,
         write(" * * * * * * * * * * * * * * * * "), nl,nl,
         write("Выберите пункт меню (1-5): "),
         readint(Choice),nl,
         process(Choice),menu.
      /* ------------------------------------------------------- */
      /* Действия по опции меню: "Добавить игрока в базу данных" */
      /* ------------------------------------------------------- */
      process(1) :-
         write("Введите имя игрока: "),
         readln(P_name),
         write("Введите название команды: "),
         readln(T_name),
         write("Введите номер игрока: "),
         readint(P_number),
         write("Введите занимаемую игроком позицию на поле: "),
         readln(Pos),
         write("Введите рост игрока: "),
         readln(Ht),
         write("Введите вес игрока: "),
         readint(Wt),
         write("Введите NFL: "),
         readint(Exp),
         write("Введите название колледжа игрока: "),
         readln(College),
         assertz(dplayer (P_name,T_name,P_number,Pos,Ht,Wt,
                           Exp,College)),
         write(P_name," добавлен в базу данных."),nl,nl,
         write("Нажмите клавишу пробел."),
         readchar(_).
      /* ------------------------------------------------------- */
      /* Действия по опции меню: "Удалить игрока из базы данных" */
      /* ------------------------------------------------------- */
      process (2) :-
         write("Введите имя игрока для удаления из базы: "),
         readln(P_name),
         retract(dplayer(P_name,_,_,_,_,_,_,_)),
         write(P_name," удалён из базы данных."),nl,nl,
         write("Нажмите клавишу пробел."),
         readchar (_).
      /* ------------------------------------------------------- */
      /* Действия по опции меню: "Просмотр сведений об игроке"   */
      /* ------------------------------------------------------- */
      process (3) :-
         write("Введите имя игрока: "),
         readln(P_name),
         dplayer(P_name,T_name,P_number,Pos,Ht,Wt,Exp,College),
         nl,write("NFL League Player"),nl,
         nl,write("Имя: ",P_name),
         nl,write("Название команды: ",T_name),
         nl,write("Позиция: ",Pos),
         nl,write("Игровой номер: ",P_number),
         nl,write("Рост: ",Ht),
         nl,write("Вес: ",Wt),
         nl,write("NFL-exp: ",Exp),
         nl,write("Колледж: ",College),nl,
         nl,write("Нажмите клавишу пробел."),
         readchar (_).
      process (3) :-
         write("Информация о данном игроке отсутствует."), nl,
         write("Извините, до свидания!"),nl,nl,
         write("Нажмите клавишу пробел."),
         readchar(_).
      /* ------------------------------------------------------------ */
      /* Действия по опции меню: "Выдача списка всех игроков из БД"   */
      /* ------------------------------------------------------------ */
      process (4) :-
         dplayer(Name, _, _, _, _, _, _, _),
         write(Name), nl,
         fail; true.
      /* ---------------------------------------------- */
      /* Действия по опции меню: "Выход из программы"   */
      /* ---------------------------------------------- */
      process(5) :-
         write("Вы уверены, что хотите выйти из программы? (y/n) "),
         readln(Answer),
         frontchar(Answer,'y',_), exit; true.
      /* ------------------------------------ */
      /* Действие по отсутствующей опции меню */
      /* ------------------------------------ */   
      process(Choice):- Choice<1,error.
      process(Choice):- Choice>5,error.
      /* --------------------------------------------------------- */
      /* Дополнительный предикат                                   */
      /* --------------------------------------------------------- */
      error:- write("Пожалуйста, выберите пункт меню от 1 до 5."),
              write("(Нажмите пробел для продолжения)"),
              readchar (_).

   goal
      do_mbase.
