Основные понятия языка ПРОЛОГ

Ковалев С.А., доц., Зори С.А., асп., Швец А.Г., доц., Зеленева И.Я., асс.- Донецк, ДонГТУ, каф. ЭВМ
			
			 


        Императивные языки программирования - программист указывает

                     шаги решения задачи и манипулирования данными.

        Декларативные языки программирования - программист задает

                     лишь логически связанные утверждения (деклара-

                     ции), а система автоматически выполняет их об-

                     работку в соответствии с внутренними алгорит-

                     мами.

 

     3) Логические связи утверждений в языке ПРОЛОГ базируются на

                     логике предикатов.

          Логика предикатов рассматривает отношения между утвержде-

                     ниями и объектами с целью получения новых отно-

                     шений.

 

                  Маша  любит  кашу              - утверждение 1

                  Саша любит то же, что и Маша   - утверждение 2

 

                  Саша  любит  кашу              - вывод

 

          Утверждение - факт:

                                  МАША  ЛЮБИТ  КАШУ

                        объект1 ----      ¦      L--- объект2

                                      отношение

 

          Утверждение - правило:

 

              САША ЛЮБИТ ЭТО,    ЕСЛИ    МАША ЛЮБИТ ЭТО

              -------T------      ¦      -------T------

               Утверждение1   Отношение  Утверждение2

 

            Шаг 1  -      ЭТО  =  КАШУ

            Шаг 2  -      САША ЛЮБИТ КАШУ

 

     4) Базовый синтаксис языка ПРОЛОГ

 

     Терм        - любой объект данных в ПРОЛОГе. Терм бывает

                   константой, переменной, составным термом.

     Константа   - представлена в ПРОЛОГе числами и атомами.

          Атом   - любая проследовательность символов, взятая

                   в кавычки. Без кавычек могут быть атомы:

                 - состоящие только из чисел, букв и символов

                   подчеркивания и начинающихся со строчной

                   буквы;

                 - состоящий целиком из специальных символов:

                     + - *  / ^ = ; : ? @ $ &

                   Атом, начинающийся с   /*   воспринимается

                   как  комментарий.

     Переменная  - любая последовательность символов букв,

                   цифр и символов подчеркивания, начинающихся

                   с прописной буквы. Область действия перемен-

                   ной - утверждение.

          Свободной называется переменная, если ей не присвоено

                   конкретное значение.

          Конкретизированной переменная становится, если ей при-

                   присвоено значение.

          Анонимной называется переменная вида "_". Анонимная

                   переменная используется, когда конкретное зна-

                   чение переменной в выражении несущественно.

     Сложный терм (структура) состоит из атома, называемого

                   главным функтором (предикатом), и последова-

                   тельности термов, называемых компонентами

                   структуры.Компоненты разделяются запятыми и

                   заключаются в круглые скобки.

 

         собака(рекс)  собака(Рекс)  собака(Х)  любит(маша,кашу)

 

          Арностью структуры называется число ее компонент.

                   В некоторых реализациях ПРОЛОГа структуры

                   могут иметь альтернативный синтаксис и

                   представляться в виде операторов,списков,строк.

 

                   плюс(А,2,6)        А = 2 + 6

 

     Утверждения (предложения) в ПРОЛОГе  могут быть двух типов -

                  факты и правила.В конце утвержденя ставится

                  точка.

          Факт  - одиночное безусловно истинное утверждение.

 

                     собака(рекс).  /*     Рекс - собака.

                     небо(голубое). /*     Небо - голубое.

 

          Правило состоит из одного головного утверждения, которое

                  истинно,если истинны одно или несколько хвосто-

                  вых утверждений.Хвостовые утверждения отделяются

                  от головного символами  :-  ,а друг от друга

                  как правило запятыми, что соответствует

                  конъюнкции.

 

            человек(Х) :- мужчина(Х).

                /*   Некто - человек, если он - мужчина.

 

            собака(А) :- родитель(А,В),собака(В).

                /*  А - собака, если родитель А - В и В - собака.

 

                   любит(маша,кашу).

                   любит(саша,Х) :- любит(маша,Х).

 

     Запрос применяются для инициализации вычислений и содержит

                  голову утверждений. Обычно запрос записывается

                  после символов  ?-  .

 

          Запрос                 Вопрос                 Ответ

          ?- любит(_,кашу).      Любит ли кто-то кашу?  Да

          ?- любит(маша,К).      Что любит Маша?        К=кашу

          ?- любит(маша,кашу).   Любит ли Маша кашу?    Да

          ?- любит(Х,кашу).      Кто любит кашу ?       Х=маша

                                                        Х=саша

          ?- любит(_,маша).      Любит ли кто-то Машу?  Нет

 

                 Унификация и конкpетизация

                    пеpеменных в ПРОЛОГе

 

     1. При доказательстве (согласовании) целевого утверждения

        ПРОЛОГ пытается  о т о ж д е с т в и т ь  термы.

        Терм Х сопоставляется с термом У по следующим правилам:

     1) Х и У - константы.

        Термы сопоставимы, если одинаковы.

     2) Х - константа или структура. У - свободная переменная.

        Термы сопоставимы, если У принимает значение Х.

     3) Х и У - структуры.

        Термы сопоставимы,  если  у  них один и тот же главный

        функтор и арность, а также каждая из компонент сопо-

        ставима.

     4) Х и У - свободные переменные.

        Термы сопоставимы.Х и У становятся сцепленными.

 

               Терм 1            Терм 2          Отождествимы?

             маша(каша)         маша(Х)          да: Х=каша

             маша(каша)         маша(сало)       нет

             маша(21,22)        маша(Х,Х)        нет

             маша(21,21)        маша(Х,Х)        да: Х=21

             маша(каша,21)      маша(_,_)        да

                 Х               f(Y,Z)          да: X=f(Y,Z)

                 X                 Z             да: X=Z

 

     2. Факт доказывается для  в с е х  значений переменной.

             собака(рекс).       /* Рекс - собака*/

             собака(джек).       /* Джек - собака*/

          ?- собака(Х).          /* Кто является собакой?*/

                Х=рекс

                Х=джек

         Правило доказывается для всех значений переменных в

              голвном целевом утверждении при условии, что

              хвостовые целевые утверждения доказаны.

             собака(рекс).

             собака(джек).

             собака(Х) :- родитель(У,Х),собака(У).

             родитель(джек,шарик). /* Джек - родитель Шарика*/

           ?- собака(шарик).     Да

           ?- собака(Х).         Х=рекс

                                 Х=джек

                                 Х=шарик

     3. Переменные в фактах и головных целевых утверждениях

          принимают конкретные значения на время доказатель-

          ства этого целевого утверждения.

        Переменные, встречающиеся только в хвостовых целевых

          утверждениях, конкретизируются на время доказатель-

          ства этого правила.

     4. Для выполнения сопоставления термов, конкретизации

          переменных и управления процессами обработки базы

          данных служат программы  в н у т р е н н е й

          у н и ф и к а ц и и  ПРОЛОГа. Они выполняют сопоста-

          вление  ц е л е й  и  п о д ц е л е й  с фактами и

          головными утверждениями правил, чтобы доказать эти

          цели и подцели.

          Если при доказательстве цели(подцели) остались необ-

          работанные факты и правила, происходит возврат в со-

          ответствующую точку базы данных для их  анализа.Этот

          процесс называется  о т к а т,  а в точку возврата

          устанавливается  у к а з а т е л ь  о т к а т а.

 

   Пример базы знаний

 

           любит(маша,кашу).

           любит(маша,яблоко).

           любит(маша,кофе).

           любит(саша,Х) :-

                любит(маша,Х), фрукт(Х), цвет(Х,красный).

           любит(саша,Х) :-

                любит(маша,Х), Х=кофе.

           фрукт(груша).

           фрукт(яблоко).

           цвет(груша,желтый).

           цвет(яблоко,красный).

           цвет(яблоко,желтый).

 

       ?- любит(саша,Х).      Х=яблоко

                              Х=кофе

 

                 СТРУКТУРА ПРОГРАММЫ

 

     Обычно программы на Турбо-Прологе имеет следующую

структуру:

 

         domains          /*определение типов данных*/

         predicates       /*определение предикатов*/

         clauses          /*определение фактов и правил*/

 

     Содержимое раздела  domains может отсутствовать,но для улуч-

шения читабельности и ясности программы заголовок  domains  реко-

мендуется всегда включать в текст.

     Перед разделом clauses (или после него) может  располагаться

раздел goal.  В этом разделе определяется цель. Цель может состо-

ять из нескольких подцелей.  Если разрабатываемая программа пред-

назначена  для работы в пакетном режиме,раздел goal не может быть

опущен.

     В программе могут присутствовать еще два раздела,  обеспечи-

вающие определение глобальных доменов и предикатов:

         global domains

         global predicates

     Определение типов данных и предикатов в этих разделах позво-

ляет обеспечить межмодульный интерфейс.

     Наконец, перед  разделом predicates может быть дополнительно

раздел,  содержащий определение предикатов динамической базы дан-

ных. Этот раздел называется

     database

     Таким образом,  программа на Турбо-Прологе может состоять из

следующих разделов:

     domains

     global domains

     database

     predicates

     global predicates

     goal

     clauses

 

     РАЗДЕЛ  PREDICATES

 

     В этом  разделе  определяются предикаты (отношения).  Каждый

предикат определяется со своим именем и своими аргументами (пара-

метрами).  Если  типы данных некоторых аргументов предопределены,

то они должны быть описаны заранее в разделе domains.

 

     РАЗДЕЛ CLAUSES

 

     В этом разделе определяются факты и правила.  Факт представ-

ляется именем предиката, за которым следует аргументы,заключенные

в круглые скобки.  Заканчивается запись факта точкой.  Все  имена

предикатов и константы должны начинаться со строчной буквы.

     Правило состоит из заголовка правила и тела правила. Заголо-

вок  представляет собой предикат,  тело состоит из термов,которые

могут быть связаны между собой словами or или and.Между  телом  и

заголовком  стоит  слово if.  Каждое правило должно заканчиваться

точкой.  Имена переменных должны начинаться с прописной  буквы  и

могут содержать только буквы, цифры или знак подчеркивания - '_'.

Максимальная длина имени-250 знаков.

     Особую роль играют анонимные переменные.  Они представляются

одиночным знаком подчеркивания.

 

     КОММЕНТАРИИ

 

     Комментарии могут располагаться в программе на  произвольном

месте.  Комментарий  начинается с последовательности символов/* и

заканчивается символами */

 

     ЗАПУСК СИСТЕМЫ

 

     Вы запускаете систему,  вводя слово PROLOG. Появляется сооб-

щение об инициализации системы,которое исчезает после нажатия лю-

бой клавиши.  Затем появляется главное меню с окнами редактирова-

ния,диалога,сообщений и трассировки.  Ниже в строке состояния вы-

водятся значения функциональных клавиш.

 

       ТИПЫ ДАННЫХ

 

     Имеется шесть следующих типов данных.

 

symbol Последовательность букв,  цифр и знаков подчеркивания, ко-

          торая  начинается со строчной буквы или заключена в ка-

          вычки.

string Любая последовательность символов, которая заключена в ка-

          вычки.

char Отдельный  символ,  заключенный  в апострофы.  integer Целое

число в диапазоне от -32768 до 32767. real Любое число,может быть

представлено в экспоненциальной

          форме.

file Имя файла.

 

     Проиллюстрируем вышесказанное примерами:

symbol    person,a1,b2,autonummer,"Prolog"

string    "превосходный сыр","123/456","кочан"

char      'A','3','?','*'

integer   5,17,-1234

real      123,0.876,-50000,1.2e+6

file      lager,einkauf,BASIS1

 

     Данные типа symbol в отличие от данных типа string запомина-

ются в таблице символов. Таблица символов размещается в оператив-

ной памяти.поэтому ее использование обеспечивает наиболее быстрый

поиск.

     Однако для  построения  таблицы  символов требуется дополни-

тельное время.

 

       КОМАНДЫ ГЛАВНОГО МЕНЮ

 

     После ввода команды PROLOG и запуска системы Турбо-Пролог на

экране появляются четыре окна:

 

     Окно редактирования  (для ввода исходной программы)

     Окно диалога         (для ввода запросов и выдачи

                           результатов)

     Окно сообщений       (для выдачи сообщений)

     Окно трассировки     (для выдачи информации о

                           выполнении программы)

 

     В само нижней строке будет выведена информация о  возможнос-

тях, предоставляемых функциональными клавишами. Выше располагает-

ся строка подсказки, и которой появляются служебные указания.

 

     Главное меню содержит семь команд:

 

         Run         Запуск программы

         Compile     Компиляция программы

         Edit        Редактирование программы

         Files       Команды управления файлами

         Setup       Изменение системных параметров

         Quit        Выход из системы

 

     Внимание: При помощи клавиши ESC вы можете выйти из любо-

го меню или подменю и вернутся в главное меню!

 

     RUN

 

     Созданная с помощью редактора программа компилируется и  вы-

полняется. Если в оперативной памяти уже находится скомпилирован-

ная программа, то компиляция не производится.

 

     COMPILE

 

     Созданная с помощью редактора программа компилируется.  Про-

цесс и результаты компиляции зависят от выбранных параметров.

 

     EDIT

 

     Служит для создания и модификации исходной программы. Коман-

ды вы найдете в пятом разделе.

 

     OPTIONS

 

     Указываются три  подпункта,  которые  определяют  результаты

последующей компиляции.

 

         Memory      Скомпилированная программа помещается в

                     оперативную память

         OBJ file    Скомпилированная программа имеет формат

                     объектного файла

         EXE file    Скомпилированная программа имеет формат

                     загрузочного файла. Установление связей

                     происходит автоматически.

 

     FILES

 

     Это меню содержит одиннадцать команд обработки файлов.

         Load          Загружает файл для обработки

         Save          Запоминает активный рабочий файл

         Directory     Выбирает оглавление

         Print         Печатает содержимое рабочего файла

         Copy          Копирует файл

         Rename        Переименовывает любой файл

         File Name     Переименовывает рабочий файл

         Module List   Формирует список модулей для выполнения

         Zap file is   Стирает содержимое рабочего файла

         editor

         Erase         Стирает любой файл

         Operating

         System        Вызывает MS-DOS с возвратом

 

         SETUP

 

     При помощи этой команды вы можете изменять следующие систем-

ные параметры.

 

         Color         Определение цветов фона и символов

                       экрана

         Window size   Изменение размера и расположения окна

         Directories   Определение оглавления

         Miscellaneous Адаптер, сообщения об ошибках, размер

                       стека

         Load

         configuration Загрузка файла SYS со значениями

                       параметров

         Save

         configuration Запоминание текущих значений параметров

                       в файле SYS

 

     QUIT

 

     Эта команда служит для выхода из системы.

 

 

               Лабораторная работа N 1.

 

         1. Составить базу данных о некоторой семье с использова-

         нием фактов о родителях и  поле.

         2. Сформулировать правила о двух родственных

            отношениях (в соответствии с N варианта):

             Отношение 1             Отношение 2

          - дед                  - брат

          - бабушка              - сестра

          - внук                 - дочь

          - внучка               - сын

          - дети                 - мать

                                 - отец

          4. Сформулировать 5 вопросов с ответами и запрсами.

          5. Построить трассы процесса работы ПРОЛОГа при

             ответе на вопросы:

              Кто явлляется < отношение 2 >  ?

              Кому приходится < отношение 1 > ?

          6. Отработать    задания   в   среде   Turbo-Prolog   c

          использованием внешней цели.

 

 

 

2.    Повторение и рекурсия

 

     1. В Прологе различают 2 типа целевых утверждений: внешнее и

        внутреннее.

        Внешняя цель - может быть задана,  когда Пролог  работает

           в режиме интерпретатора.  При этом вычисляются как пра-

           вило  в с е  возможные варианты достижения цели.

        Внутренняя цель - специальное целевое утверждение,

           щееся в самой Пролог-программе.  В этом случае программа

           может быть оттранслирована и получен выполняемый файл.

           При этом выполнение программы прерывается после дости-

           жения  п е р в о г о  варианта доказательства целевого

           утверждения.

     2. В Прологе циклические процессы обычно выполняются при по-

           мощи правил, использующих откат и рекурсию.

         *  Вид правила, выполняющего повторение при откате

               правило_повторения:-

                          <предикаты и правила>,

                          fail.             /*неудача*/

         fail - встроенный предикат Пролога, который всегда завер-

                шается неудачей.

         *  Вид правила, содержащего рекурсию:

               рекурсивное_правило:-

                          <предикаты и правила>,

                          рекурсивное_правило.

 

     3. Реализация повтора методом о т к а т а  после н е у д а ч и.

                        город ("Донецк").

                        город ("Макеевка").

                        город ("Авдеевка").

                        город ("Дружковка").

         1) Внешняя цель                2)  Внутренняя цель

            ? - город (X).                   : - город (X).

            Ответ:   Х="Донецк"             Ответ:  Х="Донецк"

                     Х="Макеевка"

                     Х="Авдеевка"

                     Х="Дружковка"

         3)

            города : -

                    город (X), write (X), nl,

                               fail.

                   : - города.

     write (<список вывода>) - встроенный предикат вывода на экран.

     nl                      - перевод строки.

                               Предикаты всегда сопоставимы.

 

     4.  Метод  о т к а т а   и   о т с е ч е н и я.

 

     Cut (отсечение) - предикат, "стирающий" все указатели отката.

                       Иногда используется символ  ! .

          4)

             города : -

                    город (X), write (X), nl,

                    условие_отсечения (X),!.

            условие_отсечения (X) : - X = "Макеевка".

                  : - города.

 

       5. Метод  п о в т о р а.

 

             повтор.

             повтор : - повтор.

             эхо    : - повтор,

                        read (X),write (X), nl,

                        условие_останова (X), !.

             условие останове (стоп): - nl, write ("Пока!").

             условие останове (X): - fail.

                 : - эхо.

 

        6. Метод  о б о б щ е н н о г о  правила р е к у р с и и.

 

          <имя правила рекурсии>: -

              <список предикатов>,

              <предикат условия выхода>,

              <список предикатов>,

              <имя правила рекурсии>,

              <список предикатов>.

 

         : - write ("Печать чисел:"),

             nl, nl, печать(1).

         печать(8).

         печать(X) : - X < 8,

                       write (X), nl

                       Y = X + 1,

                       печать (Y).

 

        Задание:   Выполнить трассировку программы :

          сум_ряда (1,1).

          сум_ряда (N,S) :- N > 0,

                            След = N-1,

                            сум_ряда (След, S1),

                            S = N + S1.

               : - сум_ряда (4 , S),

                    write ("Сумма ряда:)",

                    nl, nl,

                    write (S).

 

 

                 Лабораторная работа N 2.

 

 Организация статических  баз  данных в ОП и отработка внутренних

          целей методами:  - ОПН (откат после неудачи). - ОО (от-

          кат и отсечение).

 

  Задание:

     Составить базу данных о книгах ( зарплате) с  использованием

    следующего предиката:

 

А: книга ( тематика,  автор ,  название, год издания, место изда-

   ния,кол-во экземпляров, стоимость одного экземпляра).

 

Б: рабочий ( профессия,  ФИО, пол, год рождения, отдел, почасовая

   оплата, кол-во раб. часов в день).

 

     При этом  БД  должна содержать 15-20 предикатов "книга" 3-4х

    тем,  по несколько книг одного и того же автора, по несколько

    книг одного года издания,  а также по несколько книг , издан-

    ных в одном и том же месте (аналогично и  для  варианта  Б  -

    "рабочие").

       С использованием по необходимости методов ОПН,  ОО, задать

    внутреннюю  цель  в программе при ответе на заданные вопросы.

    При этом обеспечить ввод информации в виде таблицы с заголов-

    ками. При выполнении 2й и 3й частей задания обеспечить диалог

    с пользователем по вводу задаваемых параметров запроса и  вы-

    вод информации в удобном пользователю виде.

 

   1. С использованием метода ОПН.

 

А:

      1. Выдать названия всех книг , имеющихся в библиотеке.

      2. Выдать имена всех авторов.

      3. Выдать названия всех тематик и годы издания книг.

      4. Выдать названия всех мест издания и годы издания книг.

      5. Выдать перечень всех названий книг и их цены.

      6. Выдать  перечень  всех  названий книг с указанием кол-ва

экземпляров.

 

Б:

      1. Выдать название всех профессий рабочих, содержащихся в БД.

      2. Выдать Ф.И.О. всех рабочих, содержащихся в БД.

      3. Выдать Ф.И.О. и пол всех рабочих, содержащихся в БД.

      4. Выдать название всех профессий и отделов рабочих, содержащихся в БД.

      5. Выдать Ф.И.О., год рождения и профессии рабочих, содержащихся в БД.

      6. Выдать данные (поименно) об оплате  и  продолжительности

      рабочего дня всех рабочих, содержащихся в БД.

 

 

   2. С использованием метода ОО.

 

А:

    1. Вывести  на  печать фамилии всех авторов книг ,  стоящих в

      списке до заданной включительно.

    2. Вывести на печать перечень названий до заданного.

    3. Вывести на печать перечень тематик до заданной.

    4. Найти  первое  в  списке  название книги заданного автора,

    подсчитать стоимость всех экземпляров книги.

    5. Найти первое в списке название и автора книги,  выпущенной

    в заданном году ,  подсчитать стоимость всех экземпляров кни-

    ги.

    6. Найти первое в списке название и автора книги,  выпущенной

    в заданном месте,  подсчитать стоимость всех экземпляров кни-

    ги.

    7. Напечатать  перечни книг с одинаковой стоимостью ,с одина-

    ковыми авторами.

 

Б:

    1. Вывести на печать Ф.И.О.  всех рабочих ,  стоящих в списке

      до заданной включительно, подсчитать их дневной заработок.

    2. Вывести  на  печать названия отделов,  стоящих в списке до

      заданного включительно.

    3. Вывести на печать професии всех рабочих,  стоящих в списке

      до заданной включительно.

    4. Вывести на печать первую в списке Ф.И.О. рабочего с задан-

    ной профессией, подсчитать его месячный заработок.

    5. Вывести на печать пол первого рабочего в списке,  работаю-

    щего в заданном отделе,  и подсчитать его месячный заработок.

    6. Вывести на печать профессию, ФИО, и отдел первого в списке

    рабочего, имеющего заданную почасовую оплату.

 

 

  3. С использованием ОПН + Диалог.

 

А:

    1. Выдать названия всех книг и авторов по заданой тематике.

    2. Выдать  названия всех книг (с указанием их авторов ) выпу-

    щенных в заданном месте.

    3. Выдать  имена авторов книг ,  кол-во экземпляров которых в

    библиотеке превышает 2.

    4. Выдать названия книг (с указанием их тематики ), стоимость

    1экз.  которых выше заданной.

    5. Выдать перечень названий ,  тематик и авторов книг , выпу-

    щенных в заданном году.

    6. Выдать  перечень названий книг (с указанием кол-ва экземп-

    ляров) , изданных до указанного года.

    7. Выдать  перечень названий и авторов книг по заданной тема-

    тике ,  изданных в указанном месте.

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

    ров и стоимости 1 экз.  книг заданного автора.

    9. Подсчитать кол-во книг по указанной тематике,  стоимость 1

    экз. которых выше указанной.

    10. Выдать  информацию о стоимости всех экземпляров каждой из

    имеющихся книг.

    11. Выдать информацию о стоимости всех экземпляров книг по з

    аданной тематике.

    12. Выдать  информацию  о стоимости всех экземпляров книг за-

    данного автора.

 

Б:

    1. Выдать ФИО и профессию всех рабочих, работающих в заданном

    отделе.

    2. Выдать ФИО, пол, профессию и отделрабочих заданной профес-

    сии.

    3. Выдать ФИО, год рождения и профессию всех рабочих с задан-

    ным полом.

    4. Выдать ФИО, профессию, пол и отдел всех рабочих с заданным

    годом рождения с подсчетом дневного заработка каждого рабоче-

    го.

    5. Выдать ФИО,  пол год рождения всех рабочих,  работающих  в

    заданном отделе, с почасовой оплатой выше заданной.

    6. Выдать ФИО,  пол год рождения всех рабочих,  работающих  в

    заданном  отделе,  с рабочим днем с количеством часов в сутки

    меньше заданного.

    7. Выдать ФИО, пол и профессию всех рабочих, работающих в за-

    данном отделе и старше определенного возраста.

    8. Выдать почасовую оплату, количество рабочих часов в день и

    дневной заработок рабочих заданного пола с заданной професси-

    ей.

    9. Выдать ФИО и профессию всех рабочих, работающих в заданном

    отделе и почасовой оплатой, меньше заданной.

    10. Выдать ФИО и профессию всех рабочих, моложе определенного

    возраста с рабочим днем меньше заданного.

 

 

 

3.   Использование окон, графики.

 

     По традиции,  все   программные   продукты   фирмы   Borland

International  обладают первоклассными средствами для использова-

ния окон,  графики и звука. Система программирования Турбо-Пролог

не  является исключением.  При помощи Турбо-Пролога можно создать

несколько окон, используя предоставляемые цветовые палитры, уста-

новить цвет текста и цвет фона,  изменить размеры окон,  переклю-

чить ввод и вывод с одного окна на другое. Средства языка поддер-

живают  Цветной  Графический  Адаптер  и  Расширенный Графический

Адаптер,  обеспечивая тем самым возможность работать в  различных

графических режимах.  Программа, используя звуковые средства Тур-

бо-Пролога,  способна производить музыкальные тоны в широком диа-

пазоне частот, управляя продолжительностью их звучания.

     Программы, рассматриваемые до сих пор,  осуществляли ввод  и

вывод через окно, причем только текстовых строк. В этой главе бу-

дет описано,  как использовать в программах другие средства  Тур-

бо-Пролога: многооконность, звук и графику.

     Графика в системе программирования Турбо-Пролог  в  основном

реализуется предикатами dot и line.  С помощью зтих предикатов на

экран дисплея выводятся изображения,  состоящие из геометрических

фигур.  В данной главе будет показано, как использовать предикаты

line и dot, чтобы создать фигуры различной сложности. Описываемые

средства  будут  использованы  для вычерчивания линейных диаграмм

*1), столбиковых диаграмм и круговых диаграмм.

     Графику "черепашки"  *2)  поддерживают эти же средства.  Это

позволяет использовать в программе обычную графику и графику "че-

репашки" одновременно.

     Турбо-Пролог располагает двумя  предикатами  для  управления

звуком:  sound  и  beep.  При их описании будут изложены основные

концепции,  касающиеся высоты и длительности звука,  используемые

при          построении          музыкальных          фрагментов.

----------------------------------------------------------------

     1) Имеются в виду графики кусочно-линейных функций. -

     2) Turtle graphics (графика черепашки) - это образное наз-

вание графики, связанной с положением курсора  -  графики,  ис-

пользующей только относительные команды.

----------------------------------------------------------------

     В систему программирования Турбо-Пролог включено пять преди-

катов, позволяющих программе управлять окнами различных размеров.

Это предикаты makewindow,  shiftwindow, removewindow, clearwindow

и gotowindow. С их помощью можно создавать несколько окон, выпол-

нять ввод и вывод в определенные окна  и  устанавливать  атрибуты

окон.

 

     Создание окон предикатом makewindow

 

     Предикат makewindow является основой всех операций над окна-

ми в Турбо-Прологе. Его синтаксическая форма:

     makewindow(Window_number,

           Screen_attribute,

           Frame_attribute,

           Frame_string,

           Starting_row,

           Starting_column,

           Window_height,

           Window_width)

     Значения восьми  параметров  определяют характеристики окна.

     Параметр Window_number,  целое число,  идентифицирует окно в

программе.  Это  число  используется в качестве ссылки предикатом

gotowindow и др.

     Целочисленное значение,         присвоенное        аргументу

Screen_attribute,  определяет цвета символов и  фона.  Выбираемые

значения  атрибута зависят от того,  какой монитор используетсяц-

ветной или монохромный.

     Целочисленные значения  screen_attribute  задают  комбинацию

цветов текста и фона. Для монохромных мониторов эти значения при-

ведены                 в                табл.                8.1.

---------------------------------------------------------------

Таблица 8.1.  Значения атрибута экрана для монохромных мониторов.

---------------------------------------------------------------

  Цвет текста    Цвет фона  Screen_attribute   Примечание

---------------------------------------------------------------

   Черный         Черный         0      Пустой экран

   Белый          Черный         7      Позитивное изображение

   Черный         Белый        112      Негативное изображение

     Названия "белый" и "черный" весьма условны.  Так, под словом

"белый" подразумевают цвет, которым набран текст на мониторе, и в

действительности он либо серый либо желтый.  Заметим, что сочета-

ние черного цвета текста с черным фоном дает пустой экран.  Белый

текст на черном фоне получается на дисплее с позитивным изображе-

нием,  а  черный  текст  на  белом фоне - на дисплее с негативным

изображением.

     На ряду  с указанным существуют три необязательных атрибута,

задание которых определяет вывод символов с подчеркиванием, изоб-

ражение  с высоким разрешением и вывод мерцающих символов.  Вывод

символов с подчеркиванием реализуется,  если к значению аргумента

screen_attribute добавить 1.  Для получения изображения с высоким

разрешением,  нужно к основному значению атрибута экрана добавить

8. Символы будут мерцающими,если к значению атрибута экрана доба-

вить 128.

     Значения атрибутов экрана для цветного графического адаптера

приведены        в        табл.        8.2         и         8.3.

---------------------------------------------------------------

Таблица 8.2. Соответствие между значением атрибута и

               цветом текста для окон Турбо-Пролога

---------------------------------------------------------------

         Цвет текста              Значение атрибута

---------------------------------------------------------------

         Черный                           0

         Синий                            1

         Зеленый                          2

         Голубой                          3

         Красный                          4

         Фиолетовый                       5

         Коричневый                       6

         Белый                            7

         Серый                            8

         Светло-синий                     9

         Светло-зеленый                  10

         Светло-голубой                  11

         Светло-красный                  12

         Светло-фиолетовый               13

         Желтый                          14

         Интенсивно-белый                15

---------------------------------------------------------------

---------------------------------------------------------------

Таблица 8.3.  Соответствие между значением атрибута и

               цветом фона для окон Турбо-Пролога

---------------------------------------------------------------

       Цвет фона                Значение атрибута

---------------------------------------------------------------

         Черный                         0

         Синий                         16

         Зеленый                       32

         Голубой                       48

         Красный                       64

         Фиолетовый                    80

         Коричневый                    96

         Белый                        112

---------------------------------------------------------------

 

     Чтобы вычислить значение screen_attribute для различных ком-

бинаций  цветов,  прежде всего выберите необходимый цвет текста и

цвет фона. Затем сложите соответствующие значения атрибутов. Если

вы  хотите,  чтобы  символы мерцали,  прибавьте к результирующему

значению 128.  Вычисленное значение используется как второй аргу-

мент в предикате makewindow, т.е. screen_attribute.

     Например, чтобы создать окно с белыми  символами  на  черном

фоне, сложите 7 (белый текст) и 0 (черный фон).Их сумма 7 являет-

ся значением аргумента Screen_attribute для предиката makewindow.

Чтобы создать окно с красными символами на желтом фоне, сложите 4

(красный текст) и 104 (желтый фон),  результат будет  108.  Чтобы

создать окно с синими символами на бледно красном фоне, сложите 1

(синий текст) и 12 (бледно красный фон). Их сумма - 41, использу-

ется как второй аргумент рассматриваемого предиката.

     Аргумент Frame_attribute  предиката  makewindow  есть  целое

число, значение которого определяет рамку окна. Если значение ат-

рибута - 0,  окно не имеет видимой границы. Другие значения опре-

деляют рамку окна с параметрами, указанными в табл. 8.4.

     Часть значений атрибута рамки окна задает ее цвет. Это дела-

ется  аналогично заданию значения атрибута экрана.  Если задается

мерцающая граница,  то она всегда будет белой, с мерцающей тонкой

линией (в середине границы), имеющей указанный цвет.

     Аргумент Frame_string задает метку  окна.  Например,  меткой

окна может быть "Главное Меню","Столбиковая Диаграмма","Вспомога-

тельное Меню" и "Окно Вывода".  Строка, задаваемая в качестве ат-

рибута  frame-string будет размещена в центре верхней линии рамки

окна. Значение метки окна также может быть не определено, что со-

ответствует  отсутствию  метки.  В этом случае вводится аргумент,

состоящий    из    двух    последовательных    знаков    кавычки.

---------------------------------------------------------------

Таблица 8.4. Значение атрибута, определяющего цвет

               рамки окна в Турбо-Прологе

---------------------------------------------------------------

          Значение атрибута         Вид рамки окна

---------------------------------------------------------------

            0                   Нет рамки

            1                   Синяя рамка

            2                   Зеленая рамка

            3                   Светло-синяя рамка

            4                   Красная рамка

            5                   Фиолетовая рамка

            6                   Желтая рамка

            7                   Белая рамка

            8                   Коричневая рамка

           -1                   Мерцающая белая рамка

           -2                   Мерцающая желтая рамка

           -3                   Мерцающая фиолетовая рамка

           -4                   Мерцающая красная рамка

           -5                   Мерцающая светло-синяя рамка

           -6                   Мерцающая светло-зеленая рамка

           -7                   Мерцающая синяя рамка

           -8                   Мерцающая серая рамка

---------------------------------------------------------------

     Аргумент Starting_row предиката makewindow есть целое число,

определяющее верхнюю строку (линию) создаваемого окна. Максималь-

ное количество строк,  умещающихся на экране, 24. Значение 4 ука-

зывает, что окно начинается с четвертой строки. Для рассматривае-

мого аргумента можно использовать значения от 0 до 24.

     Аргумент Starting_column  предиката  makewindow  есть  целое

число, указывающее крайний левый столбец окна. Максимальное число

столбцов,  умещающихся на экране, 80. Поскольку столбцы нумеруют-

ся, начиная с нуля, значение Starting_column, равное 9,определяет

окно,  начинающееся с 10-го столбца.  Можно использовать значения

аргумента от 0 до 79.

     Аргумент Window_height есть целое число,  определяющее коли-

чество строк, занимаемых создаваемым окном. Максимально возможное

значение аргумента 25.

     Аргумент Window_width  есть  целое число,  указывающее число

столбцов, занимаемых окном. Максимальное значение аргумента 80.

     Если случайно  будут  указаны  такие значения номера верхней

строки и размера окна по вертикали,  что нижняя строка окна  ока-

жется  за нижней границей экрана,  Турбо-Пролог сообщит об ошибке

во время выполнения программы.  Например, если указывается значе-

ние  номера верхней строки 20 и размер окна по вертикали 7,  Тур-

бо-Пролог выдаст сообщение об ошибке:

     The parameters in makewindow are illegal.

     Аналогично, если значения номера начального столбца и ширины

окна приведут к тому, что крайний правый столбец окна окажется за

правой границей экрана,  то  будет  зафиксирована  ошибка.  Такая

ошибка  будет  получена,  если указать значение номера начального

столбца 5 и ширину окна 79.

 

Предикат shiftwindow

 

     Предикат shiftwindow используется для  смены  текущего  окна

(переключения). Его форма:

     shiftwindow(Window_number)

     Параметр Window_number является целым числом,  приписываемым

окну при его  создании.  (Это  параметр  Window_number  предиката

makewindow). Задание предиката shiftwindow(3) вызывает переназна-

чение всех операций ввода и вывода в окно, с номером 3.

     В то же время Турбо-Пролог "помнит" предыдущие окна и их ат-

рибуты. Например, если окно 3 имеет такие атрибуты, что оно будет

перекрывать  текущее  окно  (окно  4),  то  выполнение  предиката

shiftwindow(3) вызовет появление окна 3,  в которое вложено  окно

4. Информация из окна 4, частично закрытая окном 3, сохраняется и

появится на экране,  когда произойдет переключение и окно 4 вновь

станет текущим.

 

Предикат gotowindow

 

     Предикат gotowindow позволяет выполнять быстрое переключение

между двумя окнами, которые не перекрываются. Его форма:

     gotowindow(Window_number)

     Как и в предыдущем случае,  Window_number является  номером,

присвоенным окну при его создании.  Предположим,  что в программе

окна 2 и 3 не перекрываются,  и окно 2 является текущим. Для того

чтобы    сделать    окно   3   текущим,   используется   предикат

gotowindow(3).   Этот   предикат   выполняется    быстрее,    чем

shiftwindow,  и поэтому его следует использовать для переключения

между окнами, содержащими большое количество текста.

 

Предикат clearwindow

 

     Данный предикат удаляет из текущего  окна  все  текстовые  и

графические изображения. Предикат не имеет аргументов:

     clearwindow

     Окно и рамка окна,если она имеется, не разрушаются. Окно це-

ликом закрашивается соответствующим цветом фона.

 

Предикат removewindow

 

     Предикат removewindow удаляет текущее окно с экрана.  Преди-

кат аргументов не имеет, поэтому его синтаксис прост:

     removewindow

     Все текстовые и графические изображения, находящиеся в окне,

также удаляются.  Если за данным окном находится другое окно,  то

это  окно  и  его содержимое становятся видимыми.  Если удаляется

последнее из заданных окон,  на экране появляется то изображение,

которое было на нем до создания окон.

 

     Использование окон для ввода и вывода

 

     Стандартные предикаты   ввода  и  вывода  -  read,  readint,

readchar,  write и nl - также работают с любым текущим окном. Это

означает,  что  предикаты  ввода и вывода работают с любым окном,

которое было сделано текущим при  помощи  makewindow,  gotowindow

или shiftwindow.

     По умолчанию предполагается, что курсор расположен в верхнем

левом углу окна.  Однако можно использовать предикат cursor и по-

мещать курсор в любую позицию текущего окна.  Этот предикат имеет

вид:

     cursor(Row_number,Column_number).

     Аргументы Row_number  и Column_number являются целыми числа-

ми,  задающими номера строки и столбца,  по отношению  к  верхней

строке и крайнему левому столбцу экрана. Строки и столбцы нумеру-

ются начиная с  нуля:  предикат  cursor(0,0)  обеспечивает  вывод

текста, начиная с верхнего левого угла экрана. Если случайно ука-

зывается позиция курсора, выходящая за рамки текущего окна, то во

время выполнения программы Турбо-Пролог выдаст сообщение об ошиб-

ке.

     Если в качестве аргументов предиката cursor используются не-

означенные переменные,  то этим переменным присваиваются  текущие

значения строки и столбца. Подцель:

     makewindow(1,7,7,"",1,1,8,28),

     Row = 4,Col = 12,

     cursor(Row,Col),

     write("Have a Nice Day"),

     cursor(What_row,What_column).

присвоит   переменной   What_row   значение   4,  а  переменной

What_column - значение 27.

 

       Пимеры:

predicates

   start

   run(integer)

   do_sums

   set_up_windows

   clear_windows

 

clauses

   start :- set_up_windows, do_sums.

 

   set_up_windows :-

      makewindow(1, 7, 7, "", 0, 0, 25, 80),

      makewindow(1, 7, 7, "Left operand", 2, 5, 5, 25),

      makewindow(2, 7, 7, "", 2, 35, 5, 10),

      nl, write(" PLUS"),

      makewindow(2, 7, 7, "Right operand", 2, 50, 5, 25),

      makewindow(3, 7, 7, "Gives", 10, 27, 5, 25),

      makewindow(4, 7, 7, "", 17, 22, 5, 35).

 

   do_sums :- run(_), clear_windows, do_sums.

 

   run(Z) :-

      shiftwindow(1),

      cursor(2, 1), readint(X),

      shiftwindow(2),

      cursor(2, 10), readint(Y),

      shiftwindow(3), Z=X+Y, cursor(2, 10), write(Z),

      shiftwindow(4),

      write("  Please press the space bar"),

      readchar(_).

 

   clear_windows :-

      shiftwindow(1), clearwindow,

      shiftwindow(2), clearwindow,

      shiftwindow(3), clearwindow,

      shiftwindow(4), clearwindow.

/*

   Turbo Prolog 2.0 Chapter 14, Example Program 1

 

   Copyright (c) 1986, 88 by Borland International, Inc

 

*/

 

predicates

   run

 

clauses

   run :-

      makewindow(1, 20, 7, "A blue window", 2, 5, 10, 50),

      write("The characters are red"), nl,

      makewindow(2, 176, 7, "A light cyan window", 14, 25, 10, 40),

      write("This window is light cyan and the "),

      write("letters are black and blink."), nl,

      write("Please type an integer to exit."), nl,

      readint(_),

      removewindow,

      write("Please type an integer to exit."), nl,

      readint(_),

      removewindow.

 

 

                Лабораторная работа N 3.

 

    Организация вывода при помощи методов повтора и использования

       предикатов работы с окнами и графикой.

 

     Задание:

            С использованием методов повтора и предикатов  работы

     с  окнами  оформить  задание к лабораторной работе номер 2 в

     виде дружественного по отно - шению к пользователю меню. При

     этом главное меню должно содержать 4 пункта:

            1 : 3 -соответственно заданию,

            4 - выход из задания,

     а также приглашение пользователю ввести свой выбор.

     Каждое задание 1 :  3 должно иметь собственное окно. При от-

     работке заданий 1 :  3 по нажатию клавиши управление  должно

     передаваться в главное меню , при выполнении пункта 4 -поки-

     нуть программу.

 

              Лабораторная работа N 4.

 

    С использованием метода рекурсии и организации счета :

 

  А.   1.  Подсчитать кол-во рабочих заданной профессии.

       2. Подсчитать  среднюю  заработную плату (дневную) рабочих

           заданной профессии.

       3. Подсчитать  среднюю заработную плату (месячную) рабочих

           заданного пола и заданной профессии.

       4. Подсчитать среднюю продолжительность рабочего дня рабо-

           чих заданной профессии.

       5. Подсчитать среднюю почасовую оплату рабочих одного пола

           заданной професии.

       6. Подсчитать  количество рабочих ,  работающих в заданном

           отделе , старше определенного возраста.

       7. Подсчитать  количество  рабочих  с  почасовой оплатой ,

           превышающей заданную величину.

       8. Подсчитать общую почасовую оплату рабочих, родившихся в

           одном году.

       9. Подсчитать  среднюю почасовую оплату рабочих одинаковой

       профессии.  10. Подсчитать среднюю продолжительность рабо-

       чего дня рабочих в одном

           отделе.

       11. Подсчитать средний возраст рабочих каждого пола ,  ра-

           ботающих в одном отделе.

       12. Подсчитать  общие дневные расходы на оплату всех рабо-

чих.

       При этом запуск задания должен осуществляться из оснсвного

     меню (Лр3). Ввод/выод информации должен осуществляться в ок-

     нах в удобном пользователю виде, с сообщениями (в случае не-

     обходимости) о несоответствии вводимой информации содержанию

     БД.

 

   Б.  1.  Подсчитать кол-во изданий ( не экземпляров ), имеющихся

       в библиотеке

       2. Подсчитать среднюю стоимость изданий (не экземпляров) ,

       имеющихя в библиотеке.

       3. Подсчитать  среднюю стоимость изданий по заданной тема-

       тике.

       4. Подсчитать общую стоимость всех экземпляров книг по за-

       данной теме.

       5. Подсчитать  общую  стоимость  книг  по зданной тематике

       ,изданных в одном и том же году.

       6. Подсчитать кол-во экземпляров книг определенного автора

           , стимость которых выше заданой.

       7. Подсчитать  кол-во  экземпляров  книг заданного автора,

           изданных в одном и том же году по заданной тематике.

       8. Подсчитать  общую  стоимость  экземпляров книг одного и

       того же автора.

       9. Подсчитать среднее кол-во экземпляров книг,  изданных в

       заданном году.

       10. Подсчитать  среднюю  стоимость одного экземпляра книги

       по одиаковым тематикам.

       11. Подсчитать средний "возраст" книг в библиотеке.

       12. Подсчитать общую стоимость фонда библиотеки.

 

 

 

4. Организация динамических баз данных

 

     База данных (БД) - набор фактов,  записанных в доступной для

компьютера форме.

     Известны 3 модели БД:

     - иерархическая   БД   -  данные хранятся  в виде кластеров;

     - сетевая БД - данные хранятся в виде связных агрегатов, об-

       разующих сеть;

     - реляционная БД - данные организованы в виде таблиц.

     В Турбо-Прологе  принята реляционная модель БД - записи в БД

располагаются в соответствии с шаблоном.

     БД в  Турбо-Прологе  подразделяются в зависимости от способа

размещения на резидентные (хранящиеся в ОП компьютера) и  нерези-

дентные (хранящиеся на МД),  а в зависимости от возможности изме-

нения - на статические (СБД) и динамические (ДБД).

     СБД содержат  неизменяемые факты.  Общий вид этих предикатов

описан в разделе predicates,  а сами факты содержатся  в  разделе

clauses.

     ДБД содержит факты,  которые можно удалять и добавлять;  ДБД

может быть  записана на диск и считана в ОП.  Описание предикатов

ДБД содержится в разделе database программы.  Все  различные  ут-

верждения этого предиката и составляют ДБД.

     Иногда часть информации БД записывается в  виде  утверждений

СБД, а эти утверждения заносятся в ДБД после активизации програм-

мы. Предикаты СБД имеют другое имя,  но ту же форму представления

данных (шаблон), что и предикаты ДБД (часто для удобства они раз-

личаются буквой d).

     Для работы  с  ДБД  Турбо-Пролог  имеет следующие встроенные

предикаты:

     asserta, assertz - заносят факт в заданное место ДБД.

     retract, retractall - удаляют факт из ДБД.

 

     asserta(Clause) - заносит новый факт в БД, располагающуюся в

ОП перед всеми уже существующими утверждениями данного предиката.

     assertz(Clause) - выполняет ту же процедуру в конец  сущест-

вующей БД.

     retract(Existing_clause) - удаляет конкретный факт из ДБД.

     retractall(Existing_clause) - удаляет из ДБД все факты, свя-

занные с данным предикатом.

 

     Для сохранения ДБД из ОП в файл служит предикат

      save(DOS_file_name).

     Для загрузки БД в ОП из файла служит предикат

      consult(DOS_file_name).

 

     Пример 1.

/*

   База данных содержит факты о людях вида: человек(имя,возраст).

   Программа имеет внутреннюю цель, заносящую факты СБД в ДБД при

   помощи метода ОПН,  печатает полученную ДБД на экран,  а затем

   удаляет из нее всех людей, возраст которых старше 30 лет и пе-

   чатает оставшуюся часть ДБД, добавляет новую информацию в ДБД,

   печатает результирующую ДБД и сохраняет ее в файл "dbd.dat".

*/

 

 domains

      name = symbol

      age  = integer

 

 database

     dpeople(name,age)

 

 predicates

     people(name,age)

     assert_db

     create_db

     retract_db

     write_db

     end

 

 goal

    makewindow(1,5,5,"DATABASE",0,0,25,80), clearwindow,

     create_db, nl, write("1. Создана ДБД"),

    nl, write_db, write("      Press any key"), readchar(_),nl,

    nl, write("2. Удаляется информация о людях, старше 30 лет"),

     retract_db, nl, write(" Остаток ДБД"), nl,

    write_db, write("      Press any key"), readchar(_),nl,

     nl, assert_db, write(" Результирующая ДБД"),nl,

    write_db, write("      Press any key"), readchar(_), nl,

    nl, write("4. Сохраняем ДБД в файл"),nl, save("dbd.dat"),

    write("Press any key"), readchar(_), end, removewindow.

 

 clauses

     people("Вася",32).

     people("Федя",28).

     people("Света",40).

 

     create_db:- people(X,Y), assertz(dpeople(X,Y)), fail.

     create_db.

 

     retract_db:- dpeople(X,Y), Y>30, retract(dpeople(X,Y)),

                  fail.

     retract_db.

 

     write_db:- dpeople(X,Y), write(X," ",Y), nl, fail.

     write_db.

 

     assert_db:- write("3. Добавляем информацию"),nl,

                 write("Введите имя "), readln(X),

                 write("Введите возраст "), readint(Y),

                 assertz(dpeople(X,Y)).

 

     end:- dpeople(_,_),retractall(dpeople(_,_)),fail.

     end.

 

     Пример 2.

/*   Учебная программа (подсчет населения во всех городах

     базы данных с использованием ячейки динамической памяти

     (счетчика)   */

 

DOMAINS

name=symbol

num=integer

 

DATABASE

ds(num)

 

PREDICATES

town(num,name,num)

rw(num,name,name,num)

proc(num)

make_win

menu

repeat

count(num,num)

dist(name,name,num)

dcount

 

GOAL

 make_win, menu.

 

CLAUSES

town(1,"Донецк",1250).

town(2,"Moсква",8000).

town(3,"Киев",5500).

town(4,"Харьков",1300).

town(5,"ХХХ",10).

  rw(1,"Донецк","Харьков",400).

  rw(2,"Харьков","Москва",650).

  rw(3,"Донецк","Киев",600).

  rw(4,"Киев","Москва",700).

 

repeat.

repeat:-repeat.

 

make_win:- makewindow(1,7,7,"MENU",0,0,25,80), clearwindow,

           makewindow(2,3,5,"PROC_1",10,10,14,60), clearwindow,

           makewindow(3,6,6,"PROC_2",10,10,14,60), clearwindow,

           makewindow(4,4,4,"PROC_3",10,10,14,60),clearwindow,

           makewindow(5,5,5,"PROC_4",10,10,14,60),clearwindow.

 

 menu:- repeat, shiftwindow(1), nl,nl, write("1 - process 1"),nl,

        write("2 - process 2"),nl, write("3 - process 3"),nl,

        write("4 - process 4"),nl, write("5 - EXIT"),nl,nl,

        write("Enter your choice   "),

        readint(C), clearwindow, proc(C), C=5,

        removewindow(1,1) , removewindow(2,1),  removewindow(3,1),

        removewindow(4,1), removewindow(5,1) .

 

 proc(1):- shiftwindow(2), nl, write("Список городов"),

        nl,nl, town(_,X,Y), write(X,"  ",Y),

         nl, fail.

 proc(1):- nl, write("Press any key"), readchar(_),

       clearwindow.

 

 proc(2):- shiftwindow(3), nl, write("Список городов c населением больше заданного"),

        nl,nl, write("Input population    "),

        readint(P),nl,

        town(_,X,Y), Y>P, write(X,"  ",Y), nl, fail.

 proc(2):- nl, write("Press any key"), readchar(_),

       clearwindow.

 

 proc(3):- shiftwindow(4), nl,

        write("Distance between 2 towns"),nl,

        write("Input town A "),readln(A),nl,

        write("Input town B "), readln(B),

         dist(A,B,T),nl,

         write("Dist. B/W 2 Cities - ",A," and ",B," is ",T),nl,

         write("Press any key"), readchar(_),

           clearwindow.

 

 proc(5):- nl,nl,nl, write(" Bye!    Press any key"),

          readchar(_).

 

 proc(4):- shiftwindow(5), nl, asserta(ds(0)),

           dcount, ds(X),

           write("Population in all towns is ",X),nl,nl,

           write("Press any key"), readchar(_),

           retractall(ds(_)),   clearwindow.

 

 count(N,Sum):- town(N,_,Y), SumNew=Sum+Y, Nnew=N+1,

            count(Nnew,SumNew),!.

 count(N,Sum):-nl,nl, N1=N-1,

         write("Sum. Popul. in ", N1, " towns  is ", Sum),

         nl.

 

 dcount:- town(_,_,Y), ds(X), Z=X+Y, retractall(ds(_)),

          asserta(ds(Z)), fail.

 dcount.

 

 dist(A,B,T):- rw(_,A,B,T),!.

 dist(A,B,T):- rw(_,B,A,T),!.

 dist(A,B,T):- rw(_,A,C,T1), dist(C,B,T2), T=T1+T2,!.

 

 

                Лабораторная работа N 5.

 

          Используя предикаты работы с динамической базой данных,

          выполнить задание к лабораторной работе N 4.

 

 

 

5.   2Использование списков

 

Турбо-Пролог поддерживает связанные объекты, называемые  1спис-

 1ками 0.  Список  - это упорядоченный набор объектов,  следующих

друг за другом.  Составляющие списка внутренне связаны  между

собой ,  поэтому с ними можно работать и как с группой (спис-

ком в целом),  так и как с индивидуальными объектами (элемен-

тами списка).

     Турбо-Пролог  позволяет  выполнять со списком целый ряд

операций. Их перечень включает:

 

  * доступ к объектам списка

  * проверка на принадлежность к списку

  * разделение списка на два

  * слияние двух списков

  * сортировку элементов списка в  порядке  возрастания  или

убывания

 

     Списки бывают полезны при создании баз знаний (баз дан-

ных),  экспертных систем, словарей; перечень областей приме-

нения можно продолжать еще долго.

     Список  является  набором объектов одного и того же до-

менного типа. Объектами списка могут быть целые числа, дейс-

твительные числа, символы, символьные  строки  и  структуры.

Порядок расположения элементов является отличительной чертой

списка; те же самые элементы, упорядоченные  иным  способом,

представлеют уже совсем другой список. Порядок играет важную

роль в процессе сопоставления.

     Совокупность элементов списка заключается в  квадратные

скобки  ([]),  а друг от друга элементы отделяются запятыми.

Примерами списков могут служить:

 

     [1,2,3,6,9,3,4]

     [3.2,4.6,1.1,2.64,100.2]

     ["YESTERDAY","TODAY","TOMORROW"]

 

 

          _Атрибуты списка

 

     Объекты списка называются  1элементами списка 0. Список мо-

жет содержать произвольное число элементов, единственным ог-

раничением является лишь объем оперативной памяти.

     Турбо-Пролог требует, чтобы все элементы списка принад-

лежали к одному и тому же типу доменов. Другими словами, ли-

бо  все  элементы  списка - целые числа, либо все - действи-

тельные, либо все - символы, либо  -  символьные  строки.  В

Турбо-Прологе список

 

     ["JOHN WALKER",3.50,45.50]

 

некорректен  ввиду  того,  что составлен из элементов разных

типов. Списки структур являются исключением из правила.

     Количество элементов в списке  называется  его  длиной.

Длина  списка ["MADONNA","AND","CHILD"] равна 3.Длина списка

[4.50,3.50,6.25,2.9,100.15] равна 5. Список может  содержать

всего один элемент и даже не содержать элементов вовсе:

 

     ["summer"]

     []

 

     Список, не содержащий элементов, называется  1пустым 0  или

 1нулевым списком 0.

     Непустой список можно рассматривать  как  состоящий  из

двух частей:  (1)  первый элемент списка - его  1голова 0, и (2)

остальная часть списка -   1хвост 0. Голова  является  элементом

списка,  хвост есть список сам по себе. Голова - это отдель-

ное неделимое значение. Наоборот, хвост представляет из себя

список, составленный из  того,  что  осталось  от  исходного

списка  в результате "усекновения головы". Этот новый список

зачастую можно делить и дальше. Если список состоит из одно-

го элемента, то его можно разделить на голову, которой будет

этот самый единственный элемент, и хвост, являющийся  пустым

списком.

     Для того чтобы использовать в программе список, необхо-

димо описать  1предикат списка.

     Введение списков в программу с необходимостью отражает-

ся  на  трех  ее разделах. Домен списка должен быть описан в

разделе domains, а работающий со списком предикат - в разде-

ле predicates.Наконец, нужно ввести  сам  список;  то  есть,

другими словами, его нужно задать где-то в программе: либо в

разделе clauses, либо в разделе  goal.

     Отличительной особенностью описания списка является на-

личие звездочки (*) после имени домена элементов. Так запись

 

     bird_name *

 

указывает  на  то, что это домен списка, элементами которого

являются bird_name, т. е. запись bird_name* следует понимать

как список, состоящий из элементов домена bird_name.

     Описание в разделе domains, следовательно, может выгля-

деть либо как

 

     bird_list = bird_name *

     bird_name = symbol

 

либо как

 

     bird_list = symbol *

 

     Домен  bird_list является доменом списка элементов типа

symbol (списка птиц).

     В разделе описания предикатов predicates требуется при-

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

скобки имени домена.

 

     birds(bird_list)

 

   Пример:

 

   domains

 

      bird_list = bird_name *

                  bird_name = symbol

      number_list = number *

                    number = integer

 

   predicates

      birds(bird_list)

      score(number_list)

 

   clauses

      birds(["sparrow",

             "robin",

             "mockingbird",

             "thunderbird",

             "bald eagle"]).

      score([56,87,63,89,91,62,85]).

 

  1Использование  метода с разделением списка на голову и 0  1хвост

 

     Турбо-Пролог, однако, позволяет отделять от списка пер-

вый элемент и обрабатывать его отдельно. Данный метод  рабо-

тает  вне зависимости от длины списка, до тех пор, пока спи-

сок не будет исчерпан. Этот метод доступа  к  голове  списка

называется   1методом разделения списка на голову 0 и  1хвост.

     Операция деления списка на голову и хвост  обозначается

при помощи вертикальной черты (|):

 

     [Head|Tail].

 

     Head  здесь  является переменной для обозначения головы

списка,  переменная  Tail обозначает хвост списка. (Для имен

головы и хвоста списка пригодны любые допустимые  Турбо-Про-

логом имена.)

 

   /* Программа:   Голова-хвост  */

   /* Назначение:  Работа со списками  путем           */

   /*              деления на голову и хвост.          */

 

   domains

      number_list = integer *

      animal_list = symbol *

 

   predicates

      print_list(number_list)

      print_list(animal_list)

 

   clauses

      print_list([]).

      print_list([Head|Tail]) :-

                 write(Head),nl,

                 print_list(Tail).

 

     Рекурсивные правила для работы со списками  просты,  но

вместе с тем и очень важны, ввиду их применимости в большин-

стве программ.

 

 

 1Различные операции над списками

 

   /* Назначение:  Поиск нужного элемента в списке.    */

 

   domains

     number_list = number *

                   number = integer

 

     member_list = member *

                   member = symbol

 

   predicates

     find_it(number, number_list)

     find_it(member, member_list)

 

   clauses

     find_it(Head, [Head|_]).

     find_it(Head, [_|Tail]) :-

                 find_it(Head, Tail).

 

  _Деление списков

 

   /* Назначение: Разделение списка на два.               */

 

   domains

     middle = integer

     list = integer *

 

   predicates

     split(middle,list,list,list)

 

   clauses

     split(Middle,[Head|Tail],[Head|L1],L2) :-

          Head <= Middle,

          split(Middle,Tail,L1,L2).

     split(Middle,[Head|Tail],L1,[Head|L2]) :-

          split(Middle,Tail,L1,L2),

          Head > Middle.

          split(_,[],[],[]).

 

   _Присоединение списка

 

   /* Назначение: Слияние двух списков.                    */

 

   domains

     n_list = integer *

 

   predicates

     append(n_list,n_list,n_list)

 

   clauses

     append([],L,L).

     append([N|L1], L2, [N|L3]) :-

                    append(L1,L2,L3).

 

  _Сортировка списков

 

   /* Назначение:  Сортировка списка целых чисел.       */

   /*              в порядке возрастания при помощи     */

 

   domains

     number = integer

     list   = number *

 

   predicates

     insert_sort(list,list)

     insert(number,list,list)

     asc_order(number,number)

 

   clauses

     insert_sort([],[]).

     insert_sort([X|Tail],Sorted_list) :-

          insert_sort(Tail,Sorted_Tail),

          insert(X,Sorted_Tail,Sorted_list).

 

     insert(X,[Y|Sorted_list],[Y|Sorted_list1]) :-

          asc_order(X,Y), !,

          insert(X,Sorted_list,Sorted_list1).

     insert(X,Sorted_list,[X|Sorted_list]).

 

     asc_order(X,Y) :- X>Y.

 

     1Компоновка данных в список

 

     Иногда, при программировании определенных задач, возни-

кает  необходимость  собрать  данные из базы данных в список

для последующей их обработки. Турбо-Пролог содержит встроен-

ный предикат, позволяющий справиться с этой задачей без  ка-

ких бы то ни было хлопот. Таким предикатом является предикат

findall. Требуемый список представляется означенной перемен-

ной, являющейся одним из объектов предиката.

     Предописание  встроенного  предиката  findall  выглядит

следующим образом:

 

     findall(Variable_name,Predicate_expression,List_name).

 

     Variable_name обозначает здесь объект входного предика-

та Predicate_expression,а List_name является именем перемен-

ной выходного списка. Переменная должна относиться к  домену

списков, объявленному в разделе domains.

 

   /* Назначение:  Показ использования предиката       */

   /*        findall для вычисления среднего значения. */

 

   domains

     name = string

     points = real

     list = points *

 

   predicates

     football(name,points)

     sum_list(list,points,integer).

     report_average_football_score

 

   goal

     report_average_football_score.

 

   clauses

     /* факты (футбольная база данных) */

 

       football("Ohio State",116.0).

       football("Michigan",121.0).

       football("Michigan State",114.0).

       football("Purdue",99.0).

       football("UCLA",122.0).

 

     report_average_football_score :-

       findall(Points,football(_,Points),Point_list),

       sum_list(Point_list,Sum,Number),

       Average = Sum / Number,

       write("College Football Power Rating:"),

       nl,

       write("     Average Points = ",Average).

 

       sum_list([],0,0).

       sum_list([H|T], Sum, Number) :-

          sum_list(T,Sum1,Number1),

          Sum = H + Sum1,

          Number = Number1 + 1.

 

 

                      Лабораторная работа N6.

 

         С использованием предикатов работы со списками

А.

     1.  Подсчитать количество рабочих с min дневным заработком.

     2. Подсчитать количество рабочих с max почасовой оплатой.

     3. Вывести на печать инф-ю о рабочих;  ФИО расположить в ал-

     фавитномь порядке.

     4. Распечатать  инф-ю о рабочих в порядке возрастания их по-

         часовой оплаты.

     5. Распечатать  список  ФИО рабочих ,  упорядоченный по воз-

         растному признаку.

     6.  Вывести на печать список рабочих профессий.

     7. Вывести на печать перечень отделов предприятия ,  где ра-

         ботают только мужчины ( женщины).

     8. Подсчитать количество рабочих заданной профессии с  опре-

         делением их суммарного дневного заработка.

     9. Подсчитать кол-во рабочих одного пола по отделам предпри-

     ятия.

     10. Выдать в алфавитном порядке ФИО рабочих  по  каждому  из

     отделов.

     11. Определить min дневной заработок рабочего  по  заданному

     отделу с указанием ФИО этого рабочего.

     12. Определить max месячный заработок рабочих по каждому от-

делу.

 

Б.   1.  Подсчитать  кол-во изданий в библиотеке с min стоимостью 1

     экз.

     2. Определить max стоимость 1 экз.  книги по каждой из тема-

     тик.

     3. Определить  min стоимость всех экземпляров издания по за-

     данной тематике с указанием автора этого издания.

     4. Подсчитать кол-во авторов книг со стоимостью 1 экз.  кни-

         ги,выше средней по библиотеке.

     5. Вывести на печать список авторов книг ,  упорядоченный по

     алфавиту.

     6. Вывести на печать список названий книг , упорядоченный по

     "возрасту" книги.

     7.  Вывести на печать перечень мест изданий книг.

     8. Подсчитать кол-во авторов книг ,  изданных в одном и  том

         же месте ( с указанием места).

     9. Определить автора , место и год издания книги с max стои-

     мостью.

     10. Вывести на печать  перечень  тематик  книг  с  подсчетом

     кол-ва изданий книг по каждой тематике.

 

 

 

6.Предикаты Турбо-Пролога для работы с файлами

 

     В системе Турбо-Пролог имеются следующие предикаты  для

работы с файлами:

 

deletefile       уничтожение файла

save             сохранение файла на диске

renamefile       переименование файла

existfile        тест на наличие файла с данным именем

flush            сброс данных из внутреннего буфера

disk             выбор дисковода и пути доступа

dir              выдача каталога директории

 

     Кратко опишем, как работают предикаты для работы с фай-

лами. В приведенных ниже примерах file_domain является  опи-

сываемым  пользователем  файловым  доменом (как это сделать,

будет пояснено в следующем разделе), а DOS_filename  -  име-

нем,  под  которым  файл фигурирует в директории на диске. В

том случае если пример не очевиден, он снабжается пояснения-

ми.

 

     deletefile(DOS_filename)

 

     save(DOS_filename)   Сохраняет на диске утверждения ди-

намической базы данных.

 

     renamefile(Old_DOS_filename,New_DOS_filename)

 

     existfile(DOS_filename) Предикат успешен в случае, если

файл с именем, заданным переменной DOS_filename, присутству-

ет в директории.

 

     flush(file_domain)  Этот предикат сбрасывает содержимое

внутреннего буфера, отведенного для данного устройства запи-

си.

 

     disk(Path)  Если переменной  Path  присвоен  корректный

путь  доступа  (смотри  приложение С), то заданная с его по-

мощью директория становится текущей. Если же переменная Path

не означена, то данный предикат присваивает Path путь досту-

па к текущей директории.

 

     dir(Path,File_spec,File_name)  Переменной  Path  должен

быть  присвоен корректный путь доступа, переменная File_spec

задает расширение представляющей интерес группы файлов. Дан-

ный предикат выдает каталог имен файлов с заданным  расшире-

нием; вы можете выбрать среди них нужный и нажать Enter. Имя

файла будет присвоено переменной File_name.

 

     Помимо перечисленных предикатов Турбо-Пролог также под-

держивает  предикаты чтения из файла, записи в файл, модифи-

кации файла и тому подобные. Эти предикаты будут рассмотрены

позднее.

 

      Описание файлового домена

 

     Для  того чтобы использовать в программе файлы, необхо-

димо снабдить ее описанием файлового домена. Описание одного

файлового домена с именем datafile выглядит как

 

     file = datafile

     Символическое имя файла  типа  datafile  из  настоящего

примера  есть  идентификатор, который в программе может быть

логически отождествлен с DOS-овским  именем  файла  (именем,

которое  можно  видеть  при выдаче каталога директории). Это

символическое имя называют также логическим именем файла.

     В описании file можно указывать несколько символических

имен,  но  само  описание  должно  быть единственным. Если в

программе вводится несколько символических имен  файлов,  то

они разделяются между собой точкой с запятой (;) :

 

     file = datafile1; datafile2; datafile3

 

     Это  объявление  декларирует  3 символических имени для

последующего их отождествления с реальными файлами DOS.

 

       Запись в файл

 

     Перед тем, как начать писать  что-либо  в  файл,  нужно

сперва  создать его. В Турбо-Прологе файлы создаются при по-

мощи  предиката openwrite. Опишем последовательность исполь-

зования предиката openwrite и других  действий,  необходимых

для записи в файл информации:

 

1. Открытие файла. Предикат

 

     openwrite(datafile1,"FILE1.DAT").

 

где datafile1 есть введенный пользователем файловый домен, а

FILE1.DAT - имя файла в DOS, устанавливает связь между  объ-

ектами datafile1 и FILE1.DAT. Теперь ссылки на datafile1 бу-

дут  означать  обращение  к FILE1.DAT. Связь остается в силе

вплоть до закрытия файла.

     Заметим, что если файл с именем FILE1.DAT к моменту вы-

зова предиката openwrite уже присутствовал в директории,  то

его содержимое будет утрачено. Для того, чтобы застраховать-

ся  от  этой  неприятности,  можно сначала проверить наличие

файла при помощи предиката

 

     existfile("FILE1.DAT")

 

и принять соответствующие меры, если existfile  будет  успе-

шен.

2.  Назначение  файла  в  качестве устройства записи. Данную

операцию проделает предикат

 

     writedevice(datafile1).

 

3. Сама запись в файл. Можно использовать  любые  подходящие

для  этой  цели предикаты, например, write или writef. Любой

предикат write будет теперь выводить информацию не на экран,

а в файл.

4. Использование любых других предикатов и правил,  отвечаю-

щих назначению программы. Примером может служить переадреса-

ция потока данных с экрана на принтер.

5. Закрытие файла. Этой цели служит предикат

 

     closefile(datafile).

 

Когда файл закрыт, операции чтения или записи для него недо-

пустимы.  Закрытие  файла также защищает содержимое файла от

каких бы то ни было манипуляций,  так  как  теперь  возможны

лишь операции с файлом в целом.

     Еще  одним  следствием  закрытия файла является перевод

указателя файла в начало. Это может понадобиться при повтор-

ном открытии файла.

 

      Чтение из файла

 

     В  случае, если файл FILE1.DAT уже существует, то с ним

можно  поизвести  целый ряд операций. Можно считать из файла

все содержащиеся в нем данные, можно считать данные выбороч-

но, можно модифицировать их,  а  можно  произвести  дозапись

новых данных в конец файла.

     Для чтения данных из файла требуется:

 

1. Открытие файла

 

     openread(datafile1,"FILE1.DAT")

 

2. Назначение файла устройством чтения

 

     readdevice(datafile1).

 

3. Само чтение из файла при помощи соотвествующего предиката

или правила.

4. Использование произвольных предикатов и правил, отвечаю-

щих целям программы.

5. Закрытие файла

 

     closefile(datafile1).

 

     Модификация существующего файла

 

     Последовательность  действий, требуемых для модификации

уже существующего файла несколько отличается от той, которая

необходима для записи в файл или чтения из него. Прежде все-

го файл должен быть открыт для модификации (т. е. для чтения

и  записи  одновременно).  Для  этой  цели  служит  предикат

openmodify.

     Предикат

 

     openmodify(datafile1,"FILE1.DAT")

 

успешен только в том случае, если файл уже  присутствует  на

диске.  Другими  словами, файл должен быть создан при помощи

предиката openwrite. При этом следует, конечно, помнить, что

openwrite создает новый файл даже тогда, когда файл с  таким

именем уже имеется, затирая при этом все, что в нем  находи-

лось.

     Когда файл открывается для модификации, указатель поме-

щается в начало файла. Турбо-Пролог позволяет смещать указа-

тель при помощи предиката filepos.

     Модификацию файла можно разбить на следующие шаги:

 

1. Открытие файла

 

     openmodify(datafile1,"FILE1.DAT")

 

2. Переадресация вывода в файл

 

     writedevice(datafile1)

 

3.Запись в файл новых данных.

4. Использование произвольных предикатов и правил, отвечаю-

щих целям программы.

5. Закрытие файла

 

     closefile(datafile1)

 

     Дозапись в конец уже существующего файла

 

     Возможность записать новые данные в конец уже существу-

ющего   файла   обеспечивается  в  Турбо-Прологе  предикатом

openappend. Когда файл открывается для  дозаписи,  указатель

файла (см. предыдущий раздел главы) смещается в его конец.

     Следующие шаги необходимо  предпринять  для  добавления

новых данных в конец файла:

 

1. Открытие файла

 

     openappend(datafile1,"FILE1.DAT")

 

2. Переадресация вывода в файл

 

     writedevice(datafile1).

 

3. Дозапись в файл новых данных при  помощи  соответствующих

правил.

4.  Использование произвольных предикатов и правил,

отвечающих целям программы.

5. Закрытие файла

 

     closefile(datafile1)

 

   /* Назначение:  Считывание данных с клавиатуры и    */

   /*              запись их в файл на диске.          */

 

   domains

      file = datafile

      dstring, cstring = string

 

   predicates

      readin(dstring,cstring)

      create_a_file

 

   goal

      create_a_file

 

   clauses

        create_a_file :-

        nl,nl,

        write("Please enter complete filename."),

        nl,nl,

        readln(Filename),

        openwrite(datafile,Filename),

            writedevice(datafile),

            readline(Dstring),

            concat(Dstring"\13\10",Cstring),

            readin(Dstring,Cstring),

        closefile(datafile).

 

     readin("done",_) :- !.

     readin(_,Cstring) :-

           write(Cstring),

           readln(Dstring1),

           concat(Dstring1,"\13\10",Cstring1),

           writedevice(datafile),

           readin(Dstring1,Cstring1).

 

 

           Лабораторная работа N7.

 

          С использованием  предикатов работы с файлами и органи-

       зации динамической базы данных создать систему , выполняю-

       щую следующие функции :

 

   1.  Хранение исходной реляционной БД в файле на диске.

   2.  Просмотр информации в БД по заданному ключу (параметрам ).

   3. Удаление информации из БД по заданному ключу.

   4. Добавление информации в БД о новом объекте ( рабочем, книге).

   5. Сохранение по окончании работы результирующей БД в файле.

 

         В случае , если вводимые параметры не соответствуют меню

       или в БД отсутствует необходимая информация , должно выда-

       ваться соответствующее сообщение.

 

       Ключ:

 

   А.  1. Ф И О.

       2. Профессия ( ФИО в алфавитном порядке ).

       3. Год рождения (ФИО в алфавитном порядке ).

       4. Отдел ( ФИО в алфавитном порядке ).

       5. Почасовая оплата ( ФИО в алфафитном порядке ).

       6. Кол-во часов в день ( ФИО в алфавитном порядке ).

       7. Ф И О + год рождения.

       8. Профессия + пол.

       9. Почасовая оплата + кол-во час/день .

       10. Кол-во час/день ( ФИО в алфавитном порядке ) + профес-

       сия + почасовая оплата.

       11.  Ф И О + отдел.

       12. Ф И О + профессия.

 

   Б.  1. Автор.

       2. Название ( авторы в алфавитном порядке ).

       3. Год издания ( авторы в алфавитном порядке ).

       4. Место издания ( авторы в адфавитном порядке ).

       5. Стоимость 1 экземпляра ( авторы в алфавитном порядке ).

       6. Автор + стоимость 1 экземпляра .

       7. Тематика ( в алфавитном порядке ).

       8. Автор + год издания .

       9. Тема (в алфавитном порядке ) + место издания.

       10. Стоимость 1 экземпляра + кол-во.

 

 

 

       ПРИЛОЖЕНИЕ 1.

 

       Встроенные предикаты Турбо-Пролога

 

     Встроенные  (стандартные) предикаты Турбо-Пролога явля-

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

настоящего приложения предикаты сгруппированы в  зависимости

от  их функций. Во втором разделе они приводятся уже в алфа-

витном порядке; о каждом из них дается такая информация:

 

предикат(список аргументов) (типы доменов):(возможные спосо-

бы употребления)

 

     Список дополнен кратким словесным описанием  того,  что

получается в результате вызова каждого из предикатов.

 

F.1. Функциональные группы предикатов

 

Системные предикаты:

  beep, bios, comline, date, keyword, membyte, memword,

  portbyte, ptr_dword, sound, storage, system, time, trace

 

Языковые предикаты:

  bound, exit, fail, findall, free, not

 

Предикаты для работы с файлами:

  closefile, consult, deletefile, dir, disk, eof, existfile,

  filemod, filepos, file_str, flush, openappend, openmodify,

  openread, readdevice, renamefile, save, writedevice

 

Предикаты для чтения данных:

  readchar, readint, readln, readreal, readterm

 

Предикаты для записи данных:

  nl, write, writedevice, writef

 

Предикаты для работы с экраном монитора:

  attribute, back, clearwindow, cursor, cursorform, display,

  dot,   edit,   editmsg,  field_attr,  field_str,  forward,

  gotowindow, graphics, line, makewindow, pencolor, pendown,

  penpos, penup, removewindow, scr_attr,  scr_char,  scroll,

  shiftwindow, text, window_attr, window_str

 

Предикаты базы данных:

  asserta, assertz, consult, retract, save

 

Предикаты для работы со строками:

  concat, frontchar, frontstr, fronttoken, isname, str_len

 

Предикаты преобразования типов:

  char_int, str_char, str_unt, str_real, upper_lower

 

F.2. Алфавитный список предикатов

 

asserta(<факт>) (dbasedom) : (вх)

  заносит факт (утверждение) в начало резидентной БД (домен,

  обозначенный  как  dbasedom  автоматически объявляется для

  каждого предиката из раздела database)

 

assertz(<факт>) (dbasedom) : (вх)

  заносит факт (утверждение) в конец резидентной БД

 

attribute(Attr) (integer) : (вх),(вых)

  (вх):  устанавливает значение атрибута

  (вых):  присваивает переменной Attr установленное по умол-

  чанию значение атрибута

 

back(Step) (integer) : (вх)

  сдвигает экранное перо на несколько позиций назад. Величи-

  на сдвига задается значением параметра Step. Если  резуль-

  тирующая  позиция находится за пределами экрана, то данный

  предикат неуспешен

 

beep   (вх)

  при вызове этого предиката раздается звуковой сигнал

 

bios(InterruptNo,RegsIn,RegsOut)     (integer,regdom,regdom)

(вх,вх,вых)

  происходит  обращение  к подпрограммам системы прерываний.

  InterruptNo задает номер прерывания, RegsIn содержит новые

  значения регистров, а RegsOut - старые. Тип regdom  счита-

  ется  в Турбо-Прологе предописанным. Его описание выглядит

  так:

     regdom = (integer, integer, integer, integer,

               integer, integer, integer, integer)

  Компоненты типа integer соответствуют регистрам  микропро-

  цессора AX, BX, CX, DX, SI, DI, DS и ES

 

bound(Variable) (<произвольная переменная>) : (вх)

  предикат успешен в случае, если переменная означена

 

char_int(CharParam,IntParam)   (char,integer)   :  (вх,вых),

(вых,вх), (вх,вх)

 

  (вх,вых) : присваивает переменной IntParam код ASCII  зна-

  чения  IntParam

  (вых,вх)  : присваивает CharParam символ, код которого ра-

  вен значению IntParam

  (вх,вх) : предикат успешен,  если  код  символа  CharParam

  совпадает со значением IntParam

 

clearwindow

  очищает активное в настоящий момент текстовое окно, запол-

  няя его цветом фона

 

closefile(SymbolicFileName)  (file) : (вх)

  закрывает  физический  файл,  отождествленный с логическим

  файлом SymbolicFileName. Предикат успешен даже в том  слу-

  чае, если этот файл уже был закрыт

 

comline(Line) (string) : (вых)

  позволяет считать управляющие параметры Вашей программы

 

сoncat(String1,String2,String3)  (string,  string, string) :

(вх,вх,вых), (вых,вх,вх), (вх,вых,вх), (вх,вх,вх)

  (вх,вх,вых) : создает String3 путем склеивания  String1  и

  String2

  (вых,вх,вх) : если значением String2 является часть строки

  String3, то String1 означивается оставшейся частью

  (вх,вых,вх) : если значением String1 является часть строки

  String3, то String2 означивается оставшейся частью

  (вх,вх,вх)  : предикат успешен, если значение String3 сов-

  падает с результатом конкатенации String1 и String2

 

cursor(DOS_FileName) (string) : (вх)

  загружает  в память файл БД DOS_FileName (файл должен быть

  текстовым)

 

cursor(Row,Column) (integer,integer) : (вх,вх), (вых,вых)

  (вх,вх) : помещает курсор в позицию с  координатами  (Row,

  Column)

  (вых,вых):  присваивает  переменным  Row и Column значения

  текущих координат курсора

 

cursorform(Startline,Endline) (integer,integer) : (вх,вх)

  определяет высоту и вертикальное положение курсора в  пре-

  делах  отведенной  ему области из 14 линий точек (величины

  могут лежать в пределах от 1 до 14 )

 

date(Year,Month,Day) (integer,integer,integer) : (вх,вх,вх),

(вых,вых,вых)

  (вх,вх,вх) : устанавливает новое значение текущей даты при

  помощи переменных Year (год), Month (месяц), Day (день).

  (вых,вых,вых) : считывает текущую дату, которая  определя-

  ется по показаниям встроенных часов компьютера

 

deletefile(DOS_FileName) (string) : (вх)

  удаляет из текущей директории файл с заданным именем

 

dir(Pathname,FileSpecString,DOS_FileName)

(string,string,string) : (вх,вх,вых)

  активизирует  средства Турбо-Пролога для работы с файлами.

  Значения ыходных переменных Pathname и FileSpecString  оп-

  ределяют  путь  доступа и расширения файлов, имена которых

  появятся в окне каталога директории. Имя выбранного  поль-

  зователем  в  каталоге  файла  будет  присвоено переменной

  DOS_FileName

 

disk(DOS_Path) (string) : (вх,вых)

  вх : определяет новый текущий диск и  новый  текущий  путь

  доступа.  Предикат  успешен,  если диск и путь заданы пра-

  вильно

  вых : присваивает переменной DOS_Path значения заданных по

  умолчанию  имени диска и пути доступа

 

display(String) (string) : (вых)

  высвечивает значение переменной String в том окне, которое

  активно в настоящий момент

 

dot(Row,Column,Color)       (integer,integer,integer)      :

(вх,вх,вх), (вх,вх,вых)

  (вх,вх,вх) : рисует на экране  точку  (небольшой  пиксель)

  цвета  Color  в  позиции с координатами (Row,Column), если

  дисплей находится в графическом режиме

  (вх,вх,вых) : переменная Color получает номер цвета пиксе-

  ля, координаты которого задаются переменными Row и Column

 

edit(InputString,OutputString) (string,string) : (вх,вых)

  активизирует радактор Турбо-Пролога, что дает  возможность

  отредактировать  строку  InputString; новая редакция будет

  присвоена  переменной OutputString

 

editmsg(InStr,OutStr,LeftHeader,RightHeader,Message,

     HelpFileName,Position,Code) (string,string,

     string,string,string,string,integer,integer) :

     (вх,вых,вх,вх,вх,вх,вх,вых)

  вызывает редактор Турбо-Пролога. Позволяет отредактировать

  входную  строку  InStr, исправленный вариант которой будет

  содержать переменная OutStr. LeftHeader и RightHeader  со-

  держат  тексты  заголовков,  Position  задает расположение

  курсора. HelpFileName указывает имя файла, загружаемого по

  нажатию функциональной клавиши F1(Help).  Code  определяет

  клавишу  для завершения процесса редактирования (0 - функ-

  циональная клавиша F10, 1 - Esc)

 

eof(SymbolicFileName) (file) : (вх)

  предикат успешен, если указатель файла стоит на метке кон-

  ца файла SymbolicFileName

 

existfile(DOS_FileName) (string) : (вх)

  предикат успешен, если  в  текущей  директории  существует

  файл с именем, задаваемым переменной DOS_FileName

 

exit

  прекращает выполнение программы и передает управление сис-

  теме Турбо-Пролог, если программа запускалась в среде Тур-

  бо-Пролога,  или  DOS,  если запуск производился вне рамок

  этой системы

 

fail

  вызывает откат ввиду неуспеха данного предиката

 

field_attr(Row,Column,Length,Attr) (integer,integer,integer,

integer) : (вх,вх,вх,вх), (вх,вх,вх,вых)

  (вх,вх,вх,вх)  : создает поле символов длиной Length, име-

  еющее атрибут Attr, и начинающееся в позиции с координата-

  ми (Row,Column) в пределах активного окна (окно должно со-

  ответствовать  заданным  значениям  длины   и   координат)

  (вх,вх,вх,вых)  : присваивает Attr значение атрибута поля,

  длина которого есть Length, а начальная позиция  определя-

  ется координатами (Row,Column)

 

field_str(Row,Column,Length,String) (integer,integer,integer,

string) : (вх,вх,вх,вх), (вх,вх,вх,вых)

  записывает в активное окно экрана Length символов из стро-

  ки  String,  начиная с позиции с координатами (Row,Column)

  (заданное поле чтения должно находиться в пределах  актив-

  ного в настоящий момент окна)

 

filemode(SymbolicFileName,FileMode) (file,integer) : (вх,вх),

(вх,вых)

  (вх,вх)  :  позволяет  получить  доступ к двоичному файлу.

  SymbolicFileName задает имя файла, а FileMode - его тип (0

  - текстовой, 1 - двоичный)

  (вх,вых)  :  возвращает  значение   FileMode   для   файла

  SymbolicFileName

 

filepos(SymbplicFileName,FilePosition,Mode)   (file,integer,

integer) : (вх,вх,вх), (вх,вых,вх)

  (вх,вх,вх) : задает в файле SymbolicFileName  позицию,  из

  которой  будет считан, или в которую будет записан очеред-

  ной символ (Mode=0 указывает на то, что смещение будет от-

  считываться от начала файла, Mode=1 - от текущей  позиции,

  Mode=2 - от конца файла)

  (вх,вых,вх)  :  переменная  FilePosition получает значение

  смещения  текущего  положения  указателя  файла.  Смещение

  берется относительно начала файла

 

file_str(DOS_FileName,StringVariable) (string,string) :

(вх,вх), (вх,вых)

  (вх,вх)   :   записывает   строку  StringVariable  в  файл

  DOS_FileName  (максимум 64К)

  (вх,вых) : считывает в строку StringVariable символы,  со-

  держащиеся в файле DOS_FileName (до 64 Кб)

 

findall(Variable,<предикат>,ListVariable)

  записывает значение объекта Variable в список ListVariable.

  Variable  должен  являться  одним из аргументов указанного

  предиката

 

flush(SymbolicFileName) (file) : (вх)

  вызывает вывод на текущее выводное устройство  writedevice

  содержимого находящегося в оперативной памяти буфера файла

 

forward(Step) (integer) : (вх)

  в  графическом  режиме  forward  сдвигает экранное перо на

  Step позиций вперед

 

free(Variable) (<переменная>) : (вых)

  успешен, если переменная Variable не означена

 

frontchar(String,FrontChar,RestString) (string,char,string) :

(вх,вых,вых), (вх,вх,вых), (вх,вых,вх), (вх,вх,вх),

(вых,вх,вх)

  (вх,вых,вых) : присваивает первый символ строки String пе-

  ременой  FrontChar,  а   остаток   строки   -   переменной

  RestString

  Возможны  и  другие комбинации входных и выходных парамет-

  ров; важно лишь то, чтобы либо  была  означена  переменная

  String, либо переменные FrontChar и RestString одновремен-

  но

 

frontstr(NumberOfChars,String1,StartStr,String2)

(integer,string,string,string) : (вх,вх,вых,вых)

  присваивает  первые  NumberOfChars символов строки String1

  переменной  StertStr, а остаток - переменной String2

 

fronttoken(String,Token,RestString) (string,string,string) :

(вх,вых,вых), (вх,вх,вых), (вх,вых,вх), (вх,вх,вх),

(вых,вх,вх)

  (вых,вх,вх) : переменной  String  присваивается  результат

  конкатенации  Token  и  RestString.  Token может быть либо

  группой символов, задающих допустимое в Турбо-Прологе имя,

  либо символьным представлением целого или  действительного

  числа, либо одиночным символом, отличным от пробела.

  В  любых  других комбинациях входных и выходных параметров

  должны быть означены по крайней мере два аргумента  преди-

  ката

 

gotowindow(WindowNo) (integer) : (вх)

  осуществляет  очень  быстрый переход из одного окна в дру-

  гое, если эти два окна не пересекаются. Может  также  быть

  использован для перехода в окно, находящееся позади актив-

  ного в настоящий момент окна

 

graphics(ModeParam,Palette,Background)

(integer,integer,integer) : (вх,вх,вх)

  активизирует графические средства Турбо-Пролога и устанав-

  ливает  номер режима работы (ModeParam), палитры (Palette)

  и цвета фона (Background)

 

isname(StringParam) (string) : (вх)

  предикат успешен, если значением аргумента StringParam яв-

  ляется допустимое в Турбо-Прологе имя

 

keypressed(stringParam) (string) : (вх)

  успешен, если будет нажата произвольная клавиша

 

line(Row1,Col1,Row2,Col2,Color)

(integer,integer,integer,integer) : (вх,вх,вх,вх,вх)

  в  графическом режиме рисует линию между точками с коорди-

  натами (Row1,Col1) и (Row2,Col2), номер цвета задается ар-

  гументом Color

 

makewindow(WindowNo,ScrAtt,FrameAttr,Header,Row,Col,Height,

           Width)

(integer,integer,integer,string,integer,integer,integer,

integer) : (вх,вх,вх,вх,вх,вх,вх,вх), (вых,вых,вых,вых,вых,

вых,вых.вых)

  создает окно, номер которого задается WindowNo. Координаты

  окна задаются аргументами Row и Col,  высота  и  ширина  -

  Height  и  Width.  Окно  должно  умещаться на экране. Если

  FrameAttr отличен  от  0,  вокруг  окна  появится  бордюр.

  Header задает название окна

 

membyte(Segment,Offset,Byte) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

  (вх,вх,вх) : записывает значение Byte (1 байт) в память по

  адресу, задаваемому при помощи Segment и Offset

  (вх,вх,вых)  : считывает в переменную Byte из памяти байт,

  адрес  которого задается аргументами Segment и Offset

  В   обоих   случаях   адрес   вычисляется    по    формуле

  Segment*16+Offset

 

memword(Segment,Offset,Word) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

  (вх,вх,вх)  :  записывает значение Word (1 слово) в память

  по  адресу,  задаваемому  при  помощи  Segment  и   Offset

  (вх,вх,вых) : считывает в переменную Word из памяти слово,

  адрес которого задается аргументами  Segment  и  Offset

  В   обоих   случаях   адрес   вычисляется    по    формуле

  Segment*16+Offset

 

nl

  посылает  на  текущее  устройство  writedevice  комбинацию

  спецсимволов возврат каретки и перевод строки

 

not(<утверждение>)

  успешен, если <утверждение> представляет собой цель,  ока-

  завшуюся при доказательстве неуспешной

 

openappend(SymbolicFileName,DOS_FileName)   (file,string)  :

(вх,вх)

  открывает для дозаписи файл DOS_FileName  и  отождествляет

  его с логическим файлом SymbolicFileName

 

openmodify(SymbolicFileName,DOS_FileName)   (file,string)  :

(вх,вх)

  открывает для чтения и записи файл DOS_FileName и отождес-

  твляет его с логическим файлом SymbolicFileName

 

openread(SymbolicFileName,DOS_FileName)   (file,string)  :

(вх,вх)

  открывает для чтения файл DOS_FileName и отождествляет его

  с логическим файлом SymbolicFileName

 

openwrite(SymbolicFileName,DOS_FileName)   (file,string)  :

(вх,вх)

  открывает для записи файл DOS_FileName и отождествляет его

  с логическим файлом SymbolicFileName

 

pencolor(Color) (integer) : (вх)

  задает  цвет, в который будет окрашено графическое эранное

  перо. Применим только в графическом режиме

 

pendown

  после выполнения этого предиката становится возможным  ри-

  сование линий при помощи предикатов forward и back

 

penpos(Row,Column,Direction) (integer,integer,integer) :

(вх,вх,вх), (вых,вых,вых)

  (вх,вх,вх) : помещает графическое перо в позицию с коорди-

  натами (Row,Column) и ориентирует его в направлении, зада-

  ваемом аргументом Direction

  (вых,вых,вых)  : присваивает переменным координаты текущей

  позиции пера и номер его направления

 

penup

  прекращает рисование, то есть выполняет действие, обратное

  действию предиката pendown

 

portbyte(PortNo,Value) (integer,integer) : (вх,вх), (вх,вых)

  (вх,вх) : значение Value посылается  в  порт  ввода-вывода

  номер  PortNo

  (вх,вых)  : присваивает Value десятичный эквивалент значе-

  ния байта из порта ввода-вывода номер PortNo

 

ptr_dword(StringVar,Segment,Offset) (string,integer,integer)

: (вх,вых,вых), (вых,вх,вх)

  (вх,вых,вых) : выдает номер сегмента (Segment) и  смещение

  (Offset) означенной переменной StringVar

  (вых,вых,вх)  :  присваивает  переменной  StringVar строку

  символов, располагающуюся по адресу, задаваемому  аргумен-

  тами  Segment  и  Offset.  Адрес  вычисляется  по  формуле

  Segment*16+Offset. Конец строки определяется пустым (null)

  битом

 

readchar(CharVariable) (char) : (вых)

  считывает символ с текущего устройства чтения readdevice

 

readdevice(SymbolicFileName) (symbol) : (вх), (вых)

  (вх) : назначает  для  чтения  файл  с  логическим  именем

  SymbolicFileName

  (вых): переменная SymbolicFileName означивается логическим

  именем текущего устройства чтения

 

readint(IntVariable) (integer) : (вых)

  считывает  с  текущего  устройства чтения readdevice целое

  число

 

readln(StringVariable) (string) : (вых)

  считывает с текущего устройства чтения readdevice символь-

  ную строку

 

readreal(RealVariable) (real) : (вых)

  считывает с текущего устройства чтения readdevice действи-

  тельное число

 

readterm(Domain,Term) (<имя домена>,<переменная>) : (вх,вых)

  позволяет считать из открытого файла любой  объект,  запи-

  санный  туда при помощи предиката write. Объект присваива-

  ется переменной Term, коль скоро он соответствут  описанию

  домена этой переменной

 

removewindow

  удаляет текущее окно

 

renamefile(OldDOS_FileName,NewDOS_FileName)  (string,string)

: (вх,вх)

  переименовывает файл с именем OldDOS_FileName,  новое  имя

  задается  переменной NewDOS_FileName

 

save(DOS_FileName) (string) : (вх)

  сохраняет утверждение динамической базы данных в текстовом

  файле DOS_FileName

 

scr_attr(Row,Col,Attr) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

  (вх,вх,вх) : определяет значение аттрибута позиции  экрана

  с координатами  (Row,Col)

  (вх,вх,вых) : присваивает переменной Attr значение атрибу-

  та позиции экрана с координатами (Row,Col)

 

scr_char(Row,Column,Char) (integer,integer,char) :

(вх,вх,вх), (вх,вх,вых)

  (вх,вх,вх) : записывает символ Char в позицию экрана с ко-

  ординатами (Row,Column)

  (вх,вх,вых) : означивает переменную Char символом из пози-

  ции экрана с координами (Row,Column)

 

scroll(NoOfRows,NoOfCols) (integer,integer) : (вх,вх)

  смещает  активное окно вверх или вниз на количество строк,

  задаваемое параметром NoOfRows, влево или вправо на  коли-

  чество  колонок,  задаваемое параметром NoOfCols. Смещение

  вверх и влево соответствует отрицательным числам,  вниз  и

  вправо - положительным

 

shiftwindow(WindowNo) (integer) : (вх,вых)

  (вх)  : активизирует окно с номером WindowNo, а также сох-

  раняет содержимое окна, активного в момент вызова предика-

  та

  (вых) : присваивает переменной WindowNo номер активного  в

  настоящий момент окна

 

sound(Duration,Frequency) (integer,integer) : (вх,вх)

  вызывает  звучание  ноты  частоты Frequency и длительности

  Duration (длительность задается в сотых долях секунды)

 

storage(StackSize,HeapSize,TrailSize) (real,real,real) :

(вых,вых,вых)

  выдает доступный объем (в Кб) трех  динамических  областей

  памяти

 

str_char(StringParam,CharParam)  (string,char)  :  (вх,вых),

(вых,вх), (вх,вх)

  (вх,вых)  : присваивает CharParam символ, заданный при по-

  мощи StringParam

  (вых,вх) : присваивает StringParam  символ,  заданный  при

  помощи  CharParam

  (вх,вх) : успешен, если StringParam и CharParam  представ-

  ляют один и тот же символ

 

str_int(StringParam,IntParam)  (string,integer)  : (вх,вых),

(вых,вх), (вх,вх)

  (вх,вых) : присваивает IntParam двоичный эквивалент  деся-

  тичного символьного представления целого числа StringParam

  (вых,вх)  : присваивает StringParam строку, являющуюся де-

  сятичным символьным представлением целого числа IntParam

  (вх,вх) : успешен, если StringParam и IntParam представля-

  ют одно и то же число

 

str_len(String,Length) (string,integer) : (вх,вх), (вх,вых)

  (вх,вх)  : успешен, если в строке String содержится Length

  символов

  (вх,вых) : присваивает переменной Length количество симво-

  лов, содержащихся в строке String

 

str_real(StringParam,RealParam)  (string,real)  :  (вх,вых),

(вых,вх), (вх,вх)

  (вх,вых) : присваивает RealParam двоичный эквивалент деся-

  тичного символьного  представления  действительного  числа

  StringParam

  (вых,вх) : присваивает StringParam строку, являющуюся  де-

  сятичным  символьным  представлением действительного числа

  RealParam

  (вх,вх)  : успешен, если StringParam и RealParam представ-

  ляют одно и то же число

 

system(DOS_CommandString) (string) : (вх)

  позволяет исполнить команду операционной  системы,  предс-

  тавленную в виде символной строки

 

text

  возвращает экран в алфавитно-цифровой режим

 

time(Hours,Minutes,Seconds,Hundreds) (integer,integer,

integer,integer) : (вх,вх,вх,вх), (вых,вых,вых,вых)

  (вх,вх,вх,вх)  : устанавливает системные часы: Hours - ча-

  сы, Minutes - минуты, Seconds - секунды, Hundreds -  сотые

  доли секунды

  (вых,вых,вых,вых)  : присваивает переменным показания сис-

  темных часов

 

trace(Status) (symbol) : (вх,вых)

  вх : внесение предиката trace(on) в самое начало программы

  задает пошаговое ее выполнение -  трассировку.  Выключение

  трассировки  осуществляется  при помощи trace(off). Анало-

  гичные функции имеет и предикат  shorttrace,  с  той  лишь

  разницей,  что несколько меньшим становится количество ин-

  формации, выдаваемой в окно трассировки (Trace Window).

  (вых) : присваивает переменной Status значение on или off,

  в зависимости от режима выполнения программы

 

upper_lower(StringInUpperCase,StringInLowerCase)

(string,string) : (вх,вых), (вых,вх), (вх,вх)

  (вх,вых) : присваивает переменной StringInLowerCase  экви-

  валент  строки  StringInUpperCase,  в  котором все большие

  буквы  заменены на маленькие

  (вых,вх) : присваивает переменной StringInUpperCase  экви-

  валент строки StringInLowerCase, в котором  все  маленькие

  буквы  заменены на большие

  (вх,вх)  :  успешен,  если  переменные StringInLowerCase и

  StringInUpperCase представляют соответственно нижнерегист-

  ровую и верхнерегистровую версии одной и той же строки

 

window_attr(Attr) (integer) : (вх)

  приводит в соответствие со значением Attr атрибут активно-

  го окна

 

window_str(ScreenString) (string) : (вх), (вых)

  (вх) : высвечивает в активном окне экрана  значение  пере-

  менной  ScreenString

  (вых) : присваивает переменной ScreenString строку, высве-

  ченную  в активном окне

 

write(e1,e2,e3, ... ,eN) ((вх)*)

  осуществляет вывод на текущее устройство writedevice конс-

  тант или значений. Число аргументов произвольно; это могут

  быть либо константы, либо переменные, значения которых от-

  носятся к одному из стандартных доменных типов

 

writedevice(SymbolicFileName) (symbol) : (вх), (вых)

  (вх) : если файл с логическим именем SymbolicFileName отк-

  рыт,  то  данный предикат переназначает на него устройство

  вывода writedevice

  (вых) : присваивает переменной SymbolicFileName логическое

  имя  writedevice

 

writef(FormatString,Arg1,Arg2,Arg3, ... ) (вх,(вх)*)

  осуществляет форматированный вывод информации. Форматы за-

  даются в виде строки  FormatString  обычного  текста,  где

  маркеры % отмечают положение аргументов. Допустимые специ-

  фикации  формата - "-", "m", "p", "f", "e", "g". "-" озна-

  чает выравнивание слева; целые числа, следующие за  "m"  и

  "p", задают  количество  цифр слева и справа от десятичной

  точки. Спецификации "f" и "e" определяют мантиссу и  поря-

  док  числа.  Спецификация  "g" задает печать в максимально

  короткой форме

 

Предметный указатель

 

=   оператор

,   (запятая)

      разделитель между именами доменов одного типа

      заместитель and

:-  (двоеточие с дефисом)

      заместитель if

;   (точка с запятой)

      заместитель or

_   (подчерк)

      анонимная переменная

\   (обратный слэш)

      разделитель при задании пути доступа

 

 

                ПРИЛОЖЕНИЕ 2

 

                КОМАНДЫ РЕДАКТОРА

 

Значения                Управляющие             Дополнительные

                        клавиши                 клавиши

 

     Команды перемещения курсора

 

на символ влево         Ctrl-S                    <-

на символ вправо        Ctrl-D                    ->

на слово влево          Ctrl-A                    Ctrl-<-

на слово вправо         Ctrl-F                    Ctrl-->

вверх на строку         Ctrl-E                    

вниз на строку          Ctrl-X                     

вверх на страницу       Ctrl-R                    PgUp

вниз на страницу        Ctrl-C                    PgDn

к началу строки         Ctrl-QS                   Home

к концу строки          Ctrl-QD                   End

к началу файла          Ctrl-QR                   Ctrl-PgUp

к концу файла           Ctrl-QC                   Ctrl-PgDn

к началу блока          Ctrl-QB

к концу блока           Ctrl-QK

 

     Команды стирания

 

Режим вставки/замены    Ctrl-V                    Ins

Стереть левый символ                              Backspace

Стереть символ на ко-

торый указывает курсор  Ctrl-G                    Del

Стереть строку          Ctrl-Y                    Ctrl-Backspace

Стереть символы до

конца строки,начиная

с позиции,на которую

указывает курсор        Ctrl-QY

 

     Команды работы с блоками

 

Отметить начало блока   Ctrl-KB

Отметить конец блока    Ctrl-KK                   F5

Скопировать блок        Ctrl-KC                   F6

Передвинуть блок        Ctrl-KV                   F7

Стереть блок            Ctrl-KY                   F9

Считать блок с диска    Ctrl-CR

Записать блок на диск   Ctrl-KW

Включить/выключить      Ctrl-KH

маркировку блока

 

     Прочие команды

 

Вызывать справку по                               F8

редактору

Перейти к строке                                  F2

Закончить редактирование                          F10 или ESC

Включить/выключить

автоматическую вставку  Ctrl-QI

Поиск                   Ctrl-QF                   F3

Продолжение поиска                                Shift-F3

поиск и замена          Ctrl-QA                   F4

 

 

      КОМАНДЫ КОМПИЛЯТОРА

 

 

         checkcmpio    Проверка правильности прототипы

         checkdeterm   Проверка на недетерминированные предикаты

         code          Определение размера программы

         config        Активизация файла конфигурации

         diagnostics   Проведение детального анализа программы

         includ        Добавление еще одного программного файла

         nobreak       Отключение опроса клавиатуры

         nowarnings    Подавление определенных предупреждений

         project       Поддержка модульного программирования

         shorttrace    Активизация сокращенной трассировки

         trace         Активизация вывода трассировки

         trail         Изменение размера области trail

 

     CHECKCMPIO

 

     Эта команда  обеспечивает выдачу предупреждения при обра-

ботки всех предикатов с составными прототипами. Имя cmpio про-

исходит от composite input/output flow pattern. При этом пред-

полагается, что параметр предиката может быть известен или не-

известен. Например, у предиката shiftwindow (НомОкна) параметр

"НомОкна" может применяться как для ввода, так и для вывода, в

зависимости от того. свободна переменная или связана.

 

     CHECKDETERM

 

     Эта команда  обеспечивает  выдачу предупреждения в случае

использования недетерминированных   предикатов.   Напоминание:

предикат считается недетерминированным, если о при бектренкин-

ге ведет  к  альтернативным   решениям.   Применяя   отсечение

(Cut),можно сделать предикат детерминированным.

 

     CODE

 

     С помощью  этой  команды  вы  можете изменять максимально

возможный размер программы,  размещаемой в оперативной памяти.

Величина code по умолчанию-1024.

     Число 1024 задает не байты, а так называемые параграфы. В

одном параграфе содержится 16 байтов,  т.е.  в 1024 параграфах

16 К. При работе на машинах с относительно небольшой оператив-

ной памятью  необходимо уменьшать место для программного кода,

тем самым оставляя больше места для стека.

 

     CONFIG

 

     Параметры, заданные в файле конфигурации, определяют выб-

ранную системную среду.

 

     DIAGNOSTICS

 

     Если вы вставите эту команду в начало программы, то полу-

чите диагностическую таблицу, в которой будет содержаться спи-

сок предикатов  и их важнейшие свойства.  В столбце "Dbase" вы

можете увидеть,  объявлен  ли  предикат  детерминированным.  В

столбце "Determ"  помещается информация,  является ли предикат

детерминированным. В столбце "Size" дан размер кода.  И, нако-

нец, выводятся аргументы и прототипы.  Диагностическая таблица

будет выдана только при наличии в программе раздела goal.

 

     INCLUDE

 

     Эта команда обеспечивает вставку  содержимого  текстового

фала в  компилируемую  программу.  Имя этого файла должно быть

задано в формате с расширением.  Использование команды include

позволяет написать  общие  для различных программ части только

один раз и присоединять их к этим программам при компиляции.

 

     NOBREAK

 

     Обычно компилятор автоматически строит код,  обеспечиваю-

щий при  выполнении каждого предиката опрос клавиатуры на пос-

тупление Ctrl-C илиCtrl-Break.  Такой опрос  дает  возможность

прервать выполняемую программу.  Разумеется, на постоянный оп-

рос расходуется время.  Применение nobreak  прекращает  опрос,

так что ваша программа будет работать быстрее.

 

     NOWARNINGS

 

     Если вы  создали  новую  программу  и запустили ее первый

раз, то,  вернее всего,  получите несколько предупреждений  (с

номерами ошибок 420 или 3007) о том, что переменная встречает-

ся только один раз или что она несвязная.  Чтобы подавить  эти

предупреждения, в начале программы напишите команду nowarnings.

 

     PROJECT

 

     Эта команда играет роль при модульном программировании. В

описании проекта определяются все модули.

 

     SHORTTRACE

 

     Эта команда включает сокращенную  трассировку.  Программа

выполняется в пошаговом режиме. Обычно системаТурьо-Пролог оп-

тимизирует выполнение программы.  При сокращенной  трассировке

программа оптимизируется,  тогда  как  при обычной трассировке

оптимизация не производится. За словами shorttrace и trace мо-

жет следовать список предикатов, разделяемых запятыми. Трасси-

руется выполнение предикатов только из этого списка. Если пре-

дикаты не заданы, трассировка активизирована постоянно.

 

     TRACE

 

     Действие этой команды похоже на действие shorttrace.  От-

личие состоит в том, что отключается внутренняя оптимизация. В

этой связи имеют значения оба стандартных предиката trace(on)

и trace(off).  Если вы хотите активизировать трассировку в оп-

ределенном месте программы,  напишите в начале программы trace

или shorttrace и отключите трассировку с помощью trace(off). В

нужном месте включите её предикатом trace(on).  Возможна также

трассировка отдельных предикатов,  если  поставить  их  имена,

разделённые запятыми, за словом trace. (Например, trace p,g).

 

     TRAIL

 

     При помощи  этой команды можно изменить размер внутренней

области trail. Обычно для этой области место не отводится, так

как она применяется только для специальных целей (при обработ-

ке ссылочных переменных).  Размер области  задается  в  словах

(1 слово = 2 байта). Например,trail = 200.

 

 

      АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ПРЕДИКАТЫ

 

 

     Ниже приведены математические функции. В тригонометричес-

ких функциях угол задается в градусах.

 

     sin(X)          Синус

     cos(X)          Косинус

     tan(X)          Тангенс

     arctan(X)       Арктангенс

     abs(X)          Абсолютная величина

     exp(X)          Экспонента

     ln(X)           Натуральный логарифм

     log(X)          Десятичный логарифм

     sgrt(X)         Квадратный корень

 

     В Турбо-Прологе имеется шесть стандартных предикатов  для

работы с отдельными битами:

 

     bitand(A,B,E)   Логическое И (битовое)

     bitor(A,B,E)    Логическое ИЛИ (битовое)

     bitxor(A,B,E)   Исключающее ИЛИ (битовое)

     bitnot(A,B)     Логическое НЕ (битовое)

     bitleft(A,N,E)  Сдвиг на N битов влево

     bitright(A,N,E) Сдвиг на N битов вправо

 

     Здесь

         A,B = 16-битовые операнды,

         E   = 16-битовый результат,

         N   = натуральное число от 1 до 32767.

 

 

      СПИСОК ОПЕРАТОРОВ

 

 

     В системе  Турбо-Пролог  имеются следующие арифметические

операции:

 

          +        Сложение

          -        Вычитание

          *        Умножение

          /        Деление

          mod      Абсолютная величина

          div      Целочисленное деление

 

     Операции отношения:

 

          >        Больше

          <        Меньше

          =        Равно

          >=       Больше или равно

          <=       Меньше или равно

          <>       Не равно

 

     Логические операции:

 

          not      НЕ (высший приоритет)

          and      И  (средний приоритет)

          or       ИЛИ (низший приоритет)

 

 	Литература: 1.Братко И. Программирование на языке ПРОЛОГ

                      для искусственного интеллнкта.- М.: Мир,1990.

                    2.Доорс Дж., Рейблейн А.Р., Вадера С. ПРОЛОГ -

                      язык программирования будущего.- М.: Финансы

                      и статистика, 1990.

                    3.Малпас Дж. Реляционный язык ПРОЛОГ и его при-

                      менение.- М.:Наука,1990.

                    4.Стерлинг Л., Шапиро Э. Искусство программиро-

                      ввния на языке ПРОЛОГ.- М.: Мир, 1990.

 
 

 

Взято:   МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО КУРСУ "ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ"

      Ковалев С.А., доц., Зори С.А., асп., Швец А.Г., доц., Зеле-

      нева И.Я., асс.- Донецк, ДонГТУ, каф. ЭВМ