Turbo Prolog - язык и система логического программирования, разработанные фирмой Borland в начале 80-х гг.
Turbo Prolog берет свои истоки из классического языка Prolog, автором которого являются Алэн Колмероэ и другие члены "группы искусственного интеллекта" Марсельского университета (Франция), реализованного впервые в 1973 г.
Turbo Prolog имеет существенные отличия от классического языка Prolog:
• Строгая типизация данных.
• Отсутствие возможности рассматривать правила как данные, т.е. добавлять и удалять их во время работы.
• Невозможность определять операции.
Turbo Prolog является компилированным языком, в отличии от многих других аналогов и отличается высокой скоростью трансляции и выполнения (что достигнуто как раз отходом от классического языка Prolog).
Также в данной системе добавлены многие интересные возможности, характерные только для этой реализации, такие как поддержка многооконного интерфейса и графики.
Программа, написанная на Turbo Prolog’е, состоит из следующих секций:
• CONSTANTS - определение констант;
• DOMAINS - определение доменов;
• DATABASE - описание предикатов внутренней базы данных (фактов);
• PREDICATES - описание предикатов;
• CLAUSES - определение предикатов и фактов;
• GOAL - внутренняя цель.
Turbo Prolog может иметь внутреннюю цель. В этом случае программа начинает выполняться с точкой входа в секции goal.
Если внутренняя цель не задана, перед выполнением программы система попросит в интерактивном режиме указать цель пользователю.
Типы данных Turbo Prolog
В Turbo Prolog’е существуют следующие простые типы данных:
char - символ (размер 1 байт)
integer - целое число (размер 2 байта)
real - действительное число (размер 8 байт)
string - последовательность символов типа char, которая заключена в кавычки
symbol - последовательность букв латинского алфавита, цифр и знаков подчеркивания, которая начинается со строчной буквы или заключена в кавычки.
Также существуют дополнительные типы данных
ref - ссылочный номер базы данных
dbasedom - определяет объект в терме для глобальных баз данных
bt_selector - возвращаемый указатель бинарного дерева
db_selector - определенный пользователем указатель внешней базы
данных
place - переменная области размещения, принимает значения:
in_memory - в памяти;
in_ems - в расширенной памяти;
in_file - в файле
file - файловая переменная, принимает значения:
keyboard - клавиатура;
screen - экран;
printer - принтер;
com1; stdin; stdout - стандартные порты ввода/вывода
... - другие значения, присвоенные пользователем
reg - переменная для обращения к регистрам ОЗУ, принимает значение:
reg(AX,BX,CX,DX,SI,DI,DS,ES)
bgi_ilist - список целых для предикатов BGI-графики.
Также особенность данной системы является особый тип данных, называемый список. Список может содержать значения доменов определенного типа или же подсписок.
Для работы со списками существует одна единственная операция: разделение на голову и хвост.
Голова - это первый элемент списка. Хвост - остальная часть.
С помощью одной-единственной операции со списком можно проводить разнообразные действия, такие как вставка и удаление элемента, поиск элемента, подсчет длины списка и сортировка.
Пример. Взятие элемента списка по индексу.
domains
list=integer* %определяем домен list - список данных типа integer
index, value=integer
predicates
getbynum(index,list,value) %предикат - взятие элемента по индексу
clauses
getbynum(0,[H|_],H).
getbynum(N,[_|L],V):-N1=N-1,getbynum(N1,L,V).
Пример. Определение длины списка
domains
list=symbol* %определяем домен list - список данных типа symbol
predicates
length(list,integer) %предикат - определение длины списка
clauses
length([],0).
length([_|T],Sum):-
length(T,Sum1),Sum=Sum1+1.
Основные понятия Turbo Prolog’а
Домен - пользовательский или стандартный тип данных. Пользовательский домен может включать в себя несколько поддоменов и может иметь несколько альтернативных значений. Также он может содержать символическое(ие) имя(ена). Например:
Domains
Mydomain = integer %определяем домен, идентичный стандартному домену integer
Mydomain2 = pair(integer, integer) %определяем домен, включающий в себя два поддомена с типом integer
Mydomain2 = blue ; red % определяем домен, который может принимать значения blue или red.
Константа - данные, которые нельзя изменить
Терм - единообразная структура для описания данных и предикатов.
Факт - структура данных во внутренней БД, которая может быть извлечена или добавлена.
Предикат - основной функциональный объект данного языка. Условно, предикат возвращает значение failure или true. Если предикат во время выполнения возвратит значение true, то предикат, который его вызвал, будет выполняться дальше. Если предикат возвратит значение failure, то произойдет откат (бектрекинг) на предыдущий недетерменированный предикат.
Детерменированный предикат - это такой предикат, который хранит в себе точки возврата.
Недетерменированный предикат выполняется только один раз и не хранит в себе никакие состояния.
Основными понятиями, отличающие Пролог от других языков, являются унификация и бектрекинг.
Унификация это процесс сопоставление данных.
Бектрекинг это механизм отката на предыдущее состояние.
В Turbo Prolog’е нет циклов и условных операторов, как в императивных языках программирования. Программа выполняется за счет перечисленных механизмов.
Пролог является декларативным языком программирования. Это означает, что пользователь не описывает, КАК нужно выполняться алгоритм, а ЧТО нужно получить в итоге. В этом заключается как простота, так и сложность данной системы. Простота проявляется в том, что код, написанный на Прологе, короче кода, написанного, например, на языке Си, и пользователю не нужно по шагам расписывать алгоритм работы программы. Сложность заключается в том, что этот способ является непривычным и для сложных задач, особенно не специфичных для Пролога, слишком сложным, требующим глубоких знаний механизмов данной системы и опыта.
Язык Пролог является удобным инструментом для создания систем поддержки принятия решений, экспертных систем, динамических баз данных, программ с применением естественно-языковых конструкций. Он также может быть использован и для других задач общего характера, однако в силу своей специфики в решении общих задач используется крайне редко.
На сегодняшний день Turbo Prolog является устаревшей системой. Однако его идеи живы. Из современных приемников данного языка можно выделить платную систему Visual Prolog фирмы PDC, синтаксически основанную на Turbo Prolog’е с подключением объектно-ориентированного программирования. Из бесплатных систем, отметим перспективный инструмент NW Prolog для Windows, разрабатываемый на данный момент в Северо-Западного государственном заочном техническом университете города Санкт-Петербурга (выход ожидается в середине 2011 года), который поддерживает программы, написанные на Turbo Prolog’е, и содержит много дополнительных механизмов (потоки, регулярные выражения, SQL, Интернет, сокеты, поддержка WinAPI и многое другое).