Основы современных компьютерных технологий

         

Основы программирования


Алфавит языка Турбо-Пролог включает следующие символы:

  • прописные и строчные буквы латинского алфавита (A-Z, a-z);
  • цифры (0-9);
  • специальные символы: ! @ # $ & ( ) | ? * - + ? < > ; , ? . \ _" ' ?.
  • В Прологе имена используются для обозначения символических констант, доменов, предикатов и переменных. В общем случае имя должно начинаться с буквы или знака подчеркивания, за которым идет любая комбинация букв, цифр или знаков подчеркивания. При этом правила именования различных типов объектов в Пролог-программе имеют свои особенности:

  • имена символических констант и имена предикатов должны начинаться со строчной буквы;
  • имена предметных переменных (аргументы предикатов и функций) должны начинаться с прописной буквы или знака подчеркивания.
  • В качестве имени переменной в предикатах может использоваться знак подчеркивания, такая переменная называется анонимной, применяется это в случаях, когда значение переменной безразлично для Пролог-программы.

    К ключевым (служебным ) словам в языке Турбо-Пролог относятся следующие слова:



    and domains goal include
    clauses elsedef if or
    constants enddef ifdef predicates
    database global ifndef  

    Программа на Турбо-Прологе имеет следующую структуру:

    /*-----------------------------------------------------------* /

    /* Комментарии */

    /*-----------------------------------------------------------* /

    constants

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

    domains

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

    database

    /*определение предикатов динамической базы данных*/

    predicates

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

    clauses

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

    goal

    /*Определение целей*/

    /*----------------------------------------------*/

    /* Комментарии */

    /*----------------------------------------------*/

    309

    В разделе constants объявляются используемые в программе константы.

    В разделе domains объявляются нестандартные типы данных для переменных, используемых в качестве аргументов предикатов.
    В Прологе типы данных называют доменами. Связывание типа домена с конкретным аргументом (местом) предиката осуществляется в разделе predicates. Домен описывает множество значений, которые может принимать переменная предиката в ходе выполнения программы.

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

    symbol - символьная константа (длина не более 250 символов), имеет две формы записи: последовательность букв, цифр и знаков подчеркивания, начинающаяся со строчной буквы; последовательность символов, заключенная в двойные кавычки. Примеры: apple, sortl, "personal", "Курсант Петров С.В."

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

    char - отдельный символ, заключенный между двумя апострофами.

    integer - целое число в диапазоне от-32768 до +32767.

    real - действительное число, допускается обычная и экспоненциальная формы записи. Значение экспоненты должно быть в диапазоне от Е-307 до Е+308. Примеры: -34.567, 0.654, 9.76Е+3.

    file - файловая переменная, значение ее определяется по правилам именования файлов и устройств в MS DOS. При выполнении операций с файлом ее необходимо связать с конкретным файлом или устройством.

    Объявление новых доменов с использованием стандартных имеет вид:

    =

    Примеры объявлений:

    domains

    a=integer

    fas=symbol

    ret,das=real

    Такие объявления новых доменов улучшают читабельность программы и обеспечивают контроль типов значений переменных - смешивать в ходе выполнения программы переменные разных типов (доменов) нельзя.

    Кроме стандартных типов доменов, в Турбо-Прологе допускается использовать структуры доменов, состоящие из нескольких простых или сложных объектов. Объявление структуры имеет следующий вид:

    =(,...).

    Здесь называют функтором, а домены ,..., - это либо простые домены, либо имена ранее объявленных доменов, либо, в свою очередь, структуры. Структуры позволяют сортировать объекты по категориям.


    Ссылки на доменную структуру осуществляются по имени функтора.

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

    310

    Примеры объявления структур:

    domains

    d1,d2,d3=symbol

    fr=fruits(d1,d2,d3); pot(d1)

    Раздел описания предикатов predicates содержит перечень предикатов пользователя, используемых в программе. Описание предиката содержит имя предиката и список доменов его аргументов:

    (,...)

    Здесь ,...- имена стандартных доменов или имена доменов, объявленных в разделе domains.

    Один и тот же предикат может иметь различное число аргументов, такие предикаты объявляются для каждого варианта отдельно. В программе допускается использовать не более 300 предикатов, число аргументов у предиката не должно превышать 50.

    Примеры объявления предикатов:

    predicates

    add(integer,integer,integer)

    Ik(fr)

    Ik(d1,d2)

    В разделе database описываются предикаты динамической базы данных. Перечисленные здесь предикаты после подстановки в них вместо переменных констант (т.е. превращения их в факты) могут быть помещены и, если потребуется, удалены во время выполнения программы в динамическую базу данных. Делается это с помощью стандартных (встроенных в систему) предикатов: assert, asserta, assertz, consult, retract, retractall. В программе можно использовать несколько разделов database, при этом каждому из них можно назначить уникальное имя. Если имя разделу database не назначено, компилятор по умолчанию назначает имя dbasedom.

    Раздел database имеет следующий формат:

    database [-]

    dbpred1(...)

    dbpred2(...)

    В разделе clauses описываются утверждения, каждое из которых является правилом или фактом. В конце каждого утверждения ставится точка.

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

    Правило состоит из заголовка - предиката, объявленного в разделе predicates, за которым следует сперва двоеточие с дефисом (:-), а затем список вызовов предикатов (пользовательских и/или стандартных), разделенных запятыми или точками с запятой.


    Вместо двоеточия с дефисом можно использовать ключевое слово if, вместо запятой - ключевое слово and, вместо точки с запятой - ключевое слово or.

    Правила и факты, имеющие в качестве заголовка один и тот же предикат, должны быть сгруппированы в рамках одного блока, т.е. следовать в программе друг за другом.

    311

    Переменные в предикатах во время выполнения Пролог-программы могут находиться в двух состояниях: конкретизированном или свободном (неконкретизированном). Переменная является свободной, если ей не присвоено значение, в противном случае переменная является конкретизированной.

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

    Стандартные предикаты выполняют разнообразные функции по вводу-выводу, работе с файлами, выполнению функций DOS, обработке строк, поддержке графического режима, обеспечению интерфейса с другими системами программирования и т.д. Описание основных стандартных предикатов Турбо-Пролога рассматривается ниже.

    В правилах можно использовать следующие основные операции сравнения: < (меньше), > (больше), = (больше или равно), = (равно), <> или >< (не равно). Сравнивать между собой можно выражения и переменные.

    Операция = (равно) устанавливает соответствие между выражениями правой и левой частей предиката Х=Y - предикат этот записан в привычной инфиксной форме. В процессе согласования переменных используются следующие соглашения:

  • 1) если X - свободная переменная, a Y - конкретизированная, то при записи X=Y, переменная X станет конкретизированной и получит значение, равное Y;


  • 2) целые числа и строки всегда равны самим себе;


  • 3) две структуры равны, если они имеют одинаковые функторы, одинаковое число параметров и все соответствующие параметры равны между собой.


  • 4) если имеется запись вида Х=Y и обе переменные свободны, то они становятся сцепленными и при конкретизации одной из них вторая автоматически будет означена тем же значением.


  • Раздел goal содержит запрос к программе, называемый внутренним.Для внутреннего запроса Пролог осуществляет поиск только первого подходящего решения. При этом система не сообщает о результатах найденного решения (успешное или нет). Полученные при сопоставлении значения переменных, входящих в предикаты запроса, также не отображаются на экране. Эти действия должен запрограммировать программист с использованием стандартных предикатов для вывода данных.

    Раздел описания целей (goal) в компилируемой программе может отсутствовать, тогда в диалоговом окне после запуска программы на выполнение можно ввести внешний запрос. При использовании внешнего запроса Турбо-Пролог отыскивает все варианты решений и в этом же окне выводятся значения переменных предикатов запроса и сообщение об успешном или не успешном решении.

    312

    308 :: 309 :: 310 :: 311 :: 312 :: Содержание


    Содержание раздела