Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога

2.1 Основные понятия Турбо-Пролога

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

Р(А1, А2..Аn)

где Р - имя предикат;

А1,А2..Аn - аргументы.

В Турбо-Прологе предложение "Себастьян является дядей Марии" запишется в виде

Р(s,m)

где Р - предикат, выражающий отношение "является дядей";

s и m объекты "Себастьян и Мария", связанные отношением Р.

Предложения Пролог - программы бывают трех типов: факты, правила и вопросы.

Факт — простейший вид предложения. Они используется для констатации того, что выполнено некоторое отношение между объектами.

Например:

man(tom).

woman(ann).

parent(tom, ann).

Первый факт констатирует, что "tоm мужчина", второй факт, что "ann женщина", а третий факт, что "tom является родителем ann". Правила же содержат утверждения, истинность которых зависит от некоторых условий.

Например:

child(X,Y):-parent(Y,Х).

grandfather(X,У):-parent(X,Z) ,parent(Z, Y) ,man(X).

Первое правило утверждает, что "Х является ребенком Y", если истинно утверждение "Y является родителем X". Второе правило. утверждает, что "Х является дедушкой Y", если верно утверждение, что существует такой Z, что "Х является родителем Z" и "Z является родителем Y" и "Х является мужчиной".

Правила используются для определения новых предикатов через уже имеющиеся. Так, мы определяем предикат chilld(ребенок) через предикат parent(родители) и предикат gandfather(дедушка) через предикаты parent и man(мужчина).

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

Например:

Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru

grandfather(X,У):-parent(X,Z) ,parent(Z, Y) ,man(X). Процедура grandfather

В Турбо-Прологе требуется, чтобы предложения каждой процедуры были сгруппированы в одном месте.

В предикатах объекты (аргументы) могут быть конкретными и абстрактными.

Конкретный объект в простейшем случае задается именем. В Пролога действует соглашение, что имя - это идентификатор, начинающийся с маленькой буквы.

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

Особо выделяется анонимная переменная - знак подчеркивания '_'. Анонимная переменная предписывает Пролог - системе проигнорировать значение аргумента.

Например, в предложении

father(X):-parent(X,_),man(X)

определяется предикат father(отец), условная часть которого содержит предикат "Х является родителем Y". Так как для предиката father не играет особой роли, родителем кого именно является Х, то второй аргумент в предикате parent заменен на анонимную переменную.

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

Вопрос - это всегда последовательность, состоящая из одной или нескольких подцелей.

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

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

Классическим примером рекурсивного определения в Прологе служит определение предиката ancestor (предок), состоящего из двух предложений:

ancestor(X, Y): parent(X,Y). /предок(Х,Y):-родитель(Х, Y)

ancestor(X, Y):-parent(Z, Y), ancestor(X, Z). /предок(Х, Y):-родитель(Z, Y), предок(Х, Z)

Эти правила определяют два способа в соответствии с которыми одно лицо Х может быть предком другого Y. Первое правило определяет "непосредственного предка" - родителя. Второе правило определяет "отдаленного предка"- предка родителя. Данная процедура рекурсивна поскольку второе правило содержит вызов процедурой самой себя.

2.2 Стандартные типы доменов Турбо-Пролога

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

Турбо-Пролог имеет 6 встроенных типов доменов (таблица 1).

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

Например:

Domains

title, author = symbol.

year = integer

prediсates

book(title,author, year).

Или:

predicates book (symbol, symbol, integer).

Таблица 1

Тип данных Ключевое поле Пример
Символы char 'a','?','ю'
Целые числа integer 88;135
Действительные числа real 0,25; 0,56
Строки string 'robot','144'
Символические имена symbol mary,a,b,c,'Mary'
Файлы file army.txt

2.3 Структура программ Турбо-Пролога

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

- раздел domains содержит описание доменов, которые описывают различные классы объектов, используемых в программе (не обязательно);

- раздел database содержит утверждение базы данных, которые являются предикатами динамической базы данных ( не обязательно);

- раздел predicates служит для описания используемых программой предикатов (обязательно);

- в разделе goal на языке Турбо-Пролога формируется назначение создаваемой программы;

- в разделе clauses заносятся факты и правила известные априори.

Например:

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

/*----------------------->КОММЕНТАРИИ<-------------------*/

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

domains

<описание доменов>

database

<описание предикатов динамической БД>

predicates

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

goal

<целевое утверждение>

clauses

<факты и правила>

/*---------------------------комментарии-------------------------*/

Порядок следования разделов изменять нельзя (за исключением раздела goal, который может также находиться после раздела clauses).

2.4 Арифметические операторы

Пролог ориентирован прежде всего на обработку символьной информации. Однако он имеет ряд встроенных средств и для обработки числовой информации. Арифметические операции +, -, /, ~, div, mod.

Операндами операций div u mod могут быть только целые значения.

Операция div - частное отделения нацело, а mod - остаток от деления нацело.

Операции отношения: >,> =, <, <=, =, <>, ><. Операции <> и >< означают «не равно».

Функции: sin(Х), cos(X), tan(X), arctan(Х), ln(Х), log(X), ехр(Х), sqrt(Xl, abs(X), round(Х), trunc(X).

В арифметических операциях могут участвовать числа, переменные, операции (+, -, *, /, div, mod), скобки и функции. Приоритеты выполнения операций - общепринятые.

Если оба операнда integer, то результат операции integer (исключение - только операция деления '/', в этом случае результат real). Если хотя бы один операнд real, то результат - real.

2.5 Цель программы

Цель - формулировка задачи, которую программа должна решить. Турбо-Пролог использует внутренние и внешние цели. Внутренние - содержатся в программе в разделе goal, внешние вводятся с клавиатуры после запуска программы. Если цель внутренняя, то при выполнении программы Пролог- система ищет первое решение и заканчивает работу, если же цель внешняя, то Пролог-система ищет все решения. Программа работает на доказательство цели. Подцели цели доказываются слева направо последовательно, подцель за подцелью.

2.6 Примеры программ с использованием фактов и правил

2.7 В программе используется предикат likes(х,у), обозначающий отношение

"х предпочел y".

Predicates

likes(symbol,symbol). /*описание предиката*/

clauses

Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru likes(john, "Germany"). /*определение предиката*/

ikes(dick,"France").

Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru ikes(ann, "Germany"). /*используя факты*/

likes(german,"Spain").

Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru likes(lohn, "Italy").

Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru likes(mary,R):-likes(dick, R). /*используя правила*/

Краткие теоретические сведения. 2.1 Основные понятия Турбо-Пролога - student2.ru likes(nina, R):-likes(john, R), likes(ann, R).

Факты задают предпочтения объектов john, dick, ann, german.

Первое правило указывает, что "mary предпочитает то же, что и dick" (т. е. mary. любит France).

Второе правило, что "nina предпочитает то, что предпочитают john и аnn одновременно" (т.е. Germany).

Созданной Пролог-программе можно задать следующие вопросы:

- likes(german,"Spain"). Так как в программе такой факт присутствует, то в результате выполнения программы будет получен положительный ответ "yes".

- likes(john, X). Символ Х означает наличие в вопросе переменной. Результатом решения программы будет нахождение значений Х, удовлетворяющих поставленному вопросу (цели), т.е.

R = "Germany".

R = "Italy".

2 Solution.

-likes(X,Y).

Задание такого вопроса приводит к выводу на экран всевозможных значений пар (Х,Y), т.е.

Х= john, Y="Germany"

Х = dick, Y = "France"

Х = ann, Y = "Germany"

Х = german, Y = "Spain"

X= john, Y = "Italy"

Х = mary, Y = "France"

Х= nina, Y=" Germany"

Solution.

2.6.2 В программе используется предикат replay(A,B,S), обозначающий отношение "имеет ли уравнение ах+b=0 А, В решения и сколько S".

predicates replay (real, real, string).

clauses

replay(A,В,S). A=0,В=0,S="Любое х решение".

герlау(А,B,S):-А=0,B<>0,S="Решений нет".

replay(A,B,S):-А<>0, S='Решение одно'.

Этой Пролог - программе можно, например, задать следующий вопрос:

- replay(1,2,Z)

Результатом работы программы будет нахождение значения переменной Z, удовлетворяющей поставленному вопросу (цели), т.е.

Z="Решение одно".

1 Solution.

- replay(0,1,Z).

Ответ Z="Решения нет".

1 Solution.

Наши рекомендации