Шаг 3.
Динамические структуры данных в языке Prolog.
Реализация основных операций над очередью

    На этом шаге мы рассмотрим программу, в которой реализованы основные операции над очередью . В ней для наглядности создано меню.

    Текст этой программы приведен ниже:

domains
/* содержит объявления типов объектов (доменов), используемых в программе */
     list = integer*
     /* домен типа списка целых чисел */
predicates
/* содержит объявление предикатов */
     add_in_end (list, list, list)
     /* предикат, реализующий добавление компоненты в конец очереди */
     write_ochered (list, integer)
     /* предикат, реализующий вывод очереди */
     vvod (integer, list)
     /* предикат, реализующий формирование очереди */
     process (integer, list, list)
     /* предикат, выполняющий действия, описанные в меню */
     show_menu (list, list)
     /* предикат, реализующий вывод меню на экран */
     run_file
     /* предикат, позволяющий повторять вывод меню до тех пор, пока
     пользователь не выйдет из программы */
goal 
/* целевое утверждение */
     run_file.
clauses
 /* содержит утверждения */
     run_file:-
          show_menu([],_), nl,
          write ("Нажмите любую клавишу."),
          readchar (_),
          exit.
     show_menu (Spisok, S1):-
          makewindow (1,7,7,"Главное меню",0,0,25,80), nl,
          /* номер окна - 1, символы в нем белые, а фон черный (7), 
          рамка белая (7), название окна, верхний левый угол окна на
          строке 0, столбце 0, а само окно имеет 25 строк и 80 столбцов */
          write ("Выберите действие:"), nl, nl,
          write ("  1  Заполнение очереди."), nl,
          write ("  2  Добавление элемента в конец очереди."), nl,
          write ("  3  Удаление первого элемента из очереди."), nl,
          write ("  4  Печать очереди."), nl,
          write ("******************************************"), nl,
          write ("  0  Выход из программы."), nl, nl,
          write ("Укажите номер: (0-4) "),
          readint (G),
          G<5,
          process (G, Spisok, S1),
          /* Spisok - исходная очередь, S1 - результирующая очередь */
          show_menu (S1, _),!.
          /* посылаем в качестве исходной очереди результирующую */
          process (0, _, []):-!,
          /* выход из программы */
          exit.
     process (1, _, S1):-
     /* заполнение очереди */
          makewindow (2, 7, 7, "Заполнение очереди", 0, 0, 25, 80), nl,
          write ("Введите количество элементов очереди:"), nl, nl,
          readint (Kol), nl,
          write ("Вводите элементы:"), nl, nl,
          vvod (Kol,S1), nl, nl,
          write ("Очередь заполнена."),
          nl, nl,
          write ("Для продолжения нажмите любую клавишу."),
          readchar (_),
          removewindow,!.
          /* удаляет текущее окно с экрана */
     process (2, Spisok, S1):-
     /* добавление элемента в конец очереди */
          makewindow (3, 7, 7, "Добавление элемента в конец очереди",
          0, 0, 25, 80), nl,
          write ("Введите добавляемый в конец элемент:"), nl, nl,
          readint (X), nl,
          add_in_end (Spisok, [X], S1),
          write ("Элемент в конец добавлен."),
          nl, nl,
          write ("Для продолжения нажмите любую клавишу."),
          readchar (_),
          removewindow,!.
     process (3, Spisok, S1):-
     /* удаление первого элемента из очереди */
          makewindow (4, 7, 7, "Удаление первого элемента из очереди", 
          0, 0, 25, 80), nl,
          write ("Элемент из начала очереди удален."), nl, nl,
          Spisok = [_|S1],
          write ("Для продолжения нажмите любую клавишу."),
          readchar (_),
          removewindow,!.
     process (4, Spisok, S1):-
     /* печать очереди */
          nl, nl,
          write ("Полученная очередь:"), nl ,nl,
          write_ochered (Spisok, 0), nl, nl,
          S1 = Spisok,
          write ("Для продолжения нажмите любую клавишу."),
          readchar (_),
          removewindow,!.

     vvod (0, []):-!.
     vvod (N, L):-
          readint (X),
          N1=N-1,
          vvod (N1, LL),
          L = [X|LL].

     add_in_end ([], S, S).
     add_in_end ([X|S1], S2, [X|S3]):-
          add_in_end (S1, S2, S3).

     write_ochered ([], 0):-
          write ("Очередь пустая!!!").
     write_ochered ([], 1):-!.
     write_ochered ([H|T], _):-
          write (H, "  "),
          write_ochered (T, 1).
Текст этой программы можно взять здесь.

    В данной программе также описан предикат, который позволяет выводить последовательно все элементы списка.

    На следующем шаге мы начнем рассматривать этот предикат.




Предыдущий шаг Содержание Следующий шаг