На этом шаге мы рассмотрим программу, в которой реализованы основные операции над очередью .
В ней для наглядности создано меню.
Текст этой программы приведен ниже:
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).
В данной программе также описан предикат, который позволяет выводить последовательно все элементы списка.
На следующем шаге мы начнем рассматривать этот предикат.