1. Язык логического программирования Пролог. Концепция логического
программирования. Язык Пролог является представителем семейства языков
логического программирования. Пролог не является языком программирования в
чистом виде. Его можно считать и оболочкой экспертной системы, и реализацией
интеллектуальной базы данных. Фактически Пролог является не процедурным, а
декларативным языком. В качестве типовых данных Пролог использует элементарные
единицы данных, так называемые атомы строки символов и числа. Сама "программа"
строится из последовательности фактов и правил, и затем формулируется
утверждение, которое Пролог будет пытаться доказать с помощью введенных правил.
Таким способом можно описывать очень сложные проблемы, которые будут решаться
самим Прологом автоматически. Человек лишь описывает структуру задачи, а
внутренний "мотор" сам ищет решение. Отличие от других языков: Программа на
прологе не является алгоритмом. Пролог предназначен не для решения
вычислительных или графических задач, а для решения логических задач. Пролог
требует особого стиля мышления программиста. Программирование на прологе
состоит из следующих этапов: Объявления некоторых фактов об объектах и
отношениях между ними, Определение некоторых правил об объектах и отношениях
между ними и Формулировки вопросов об объектах и отношениях между ними.
2. Основы программирования на Турбо-Прологе: структура программы,
основные типы данных, работа с секцией domains. Программа на Турбо Прологе
состоит из следующих семи разделов: директивы компилятора;CONSTANTS -
раздел описания констант;DOMAINS - раздел описания доменов; DATABASE -
раздел описания предикатов внутренней базы данных;PREDICATES - раздел
описания предикатов; CLAUSES - раздел описания предложений(факты и правила);
GOAL - раздел описания внутренней цели. GLOBAL DOMAINS, GLOBAL
PREDICATES, GLOBAL – используется в модульном программировании и означает,
что ниже следующее объявление относится к нескольким программам.
Основные стандартные домены - это: integer - целое число от -32768 до 32767; real -
действительное число от +1Е-307 до +1Е308; char - символ, заключенный в
одиночные апострофы; string - последовательность символов, заключенная в двойные
кавычки; symbol - символическая константа (начинающаяся со строчной буквы
последовательность букв латинского алфавита, цифр и знаков подчеркивания или
последовательность любых символов, заключенная в кавычки). Этот домен
соответствует понятию атома; file - файл. file=<имя файлового домена1>;...;<имя
файлового доменаN>. 1 формат: name=t (например, age, number=integer); 2 формат:
mylist=elevent*(например, namlist=integer*); 3 формат: region=functor1(d1,d2,
…);functor2(d3,d4,…);…(пример: 1.object=int(integer); str(string) 2.mesto=sprava; sleva).
functor1, functor2 – это имена альтернатив составной области. d1,d2, d3,d4 – один из
типов пролога, который является стандартным, либо определены в разделе domains.
3. Основы программирования на Турбо-Прологе: структура программы,
внутренние и внешние цели. Указывается вопрос (цель), на который должен
ответить Пролог. 1) Цель может быть внутренней и внешней (Отличия в том, что при
использовании внешней пролог ищет все решения, а внутренней только первое). 2)
Отправная точка логического вывода. 3) На любой запрос пролог будет пытаться дать
ответ «yes» или «no», если решений нет, то ("No solution"). Запросы (цели ) 2 типа: 1
тип: Подтвердить справедливость факта или совокупность фактов. На запросы такого
типа система выдает ответ «да» или «нет». 2 тип: В записях таких вопросов
используют переменные – последовательности символов русского или латинского
алфавитов, начинающихся с прописной буквы или символа «_». В качестве ответов
выводятся значения переменных, удовлетворяющих информации в БЗ. Переменные:
Обязательно начинается с прописной буквы
Крайне желательно использовать осмысленные имена переменных. Анонимная
переменная: Анонимной переменной называют знак подчёркивания «_»; Она
используется когда конкретное значение переменной несущественно.
4. Основы программирования на Турбо-Прологе: структура программы,
предикаты, факты, правила. Предикат – конструкция вида: <имя>(<аргументы>)
аргументы обозначают какие-то объекты или свойства объектов, а имя предиката –
связь или отношение между аргументами. Общий вид описание предиката:
name(d1,d2,…). Факт – это утверждение о том, что соблюдается некоторое отношение.
Факт записывается в виде предиката, аргументы которого являются константами
(символьными или числовыми). БД на Прологе – совокупность фактов. БЗ состоит из
совокупности фактов и правил. Правило – предложение, носящее более общей
характер, чем частный факт. Правило определяет новый предикат через предикаты,
определенные ранее. <голова правила>:-<тело правила>. Тело правила выполняет
роль условия (посылки) истинности головы правила: если истинно тело правила, то
справедлива голова правила. <тело правила> - список ранее определённых фактов
разделённых логической связкой И, ИЛИ, НЕ и т.д. Знак «:-» читается как «ЕСЛИ».
Знак «,» читается как «И». Знак «;» читается как «ИЛИ».
5. Основы программирования на Турбо-Прологе: методы и средства управления
поиском решения.Управление поиском с возвратом заключается в решении двух
задач: включении поиска с возвратом при его отсутствии, и отключении поиска с
возвратом при его наличии. Предикат fail, включает поиск с возвратом. Предикат !
(его называют «отсечение»), предотвращает поиск с возвратом. Действует предикат
fail очень просто – цель с использованием данного предиката НИКОГДА не
доказывается, а, следовательно, всегда включается поиск с возвратом. Используется
для поиска всех ответов если в программе присутствует внутренняя цель. Еще одно
средство для управления поиском с возвратом – это стандартный предикат !
(отсечение). Действие этого предиката прямо противоположно действию предиката
fail. Если предикат fail всегда включает поиск с возвратом, то отсечение поиск с
возвратом прекращает. Вид правила повтора, определяемого программистом: repeat.
% повторить; repeat :- repeat. Когда при выполнении программы в одном из ее правил
встретится подцель с предикатом repeat и выполнение следующих подцелей будет
успешным, произойдет возвращение к подцели repeat для поиска других возможных
решений, а ее обращение к правилу repeat создаст условия для отката и повторного
выполнения следующих подцелей.
Для задания режима трассировки в начало программы вводится директива
компилятору trace. CALL: (имя выполняемого предиката и значения его
аргументов); RETURN: (возвращаемый предикат со звездочкой впереди) - когда
предикат или правило удовлетворяются; FAIL: (предикат) - когда предикат не
удовлетворяется (не FILE); REDO - показывает, что производится поиск с
возвратом.
6. Основы программирования на Турбо-Прологе: рекурсия. Рекурсия – это
универсальное средство для организации повторяющихся действий в Prolog’е.
Рекурсивная процедура – это процедура, вызывающая сама себя до тех пор, пока не
будет соблюдено некоторое условие, которое остановит рекурсию. Такое условие
называют граничным. Рекурсия – хороший способ для решения задач, содержащих в
себе подзадачу такого же типа. Базисом рекурсии называют некую начальную
ситуацию или ситуацию в момент прекращения. Как правило, в этом предложении
записывается некий простейший случай, при котором ответ получается сразу, без
использования рекурсии. Шаг рекурсии это правило, в теле которого обязаельно
содержится, в качестве подцели, вызов определяемого предиката. Если мы хотим
избежать зацикливания, определяемый предикат должен вызываться не от тех же
параметров, которые указаны в заголовке правила. Параметры должны изменяться на
каждом шаге так, чтобы в итоге либо сработал базис рекурсии, либо условие выхода
из рекурсии, размещенное в самом правиле. Общий вид: <имя определяемого
предиката>:- [<подцели>], [<условие выхода из рекурсии>], [<подцели>], <имя
определяемого предиката>, [<подцели>]. Хвостовая рекурсия: Можно
сформулировать условия, при соблюдении которых рекурсия в Prolog’е становится
хвостовой, то есть не расходует стек при неограниченном количестве рекурсивных
вызовов: рекурсивный вызов должен быть последней целью в хвостовой части
правила вывода; перед рекурсивным вызовом не должно быть точек возврата.
7. Основы программирования на Турбо-Прологе: тип данных "список", работа
со списками. Список – это упорядоченный набор объектов, следующих друг за
другом, произвольной длины. Список задается перечислением элементов списка через
запятую в квадратных скобках. Количество элементов в списке называется его
длиной. Список, который не содержит ни одного элемента, называется пустым
списком. Он обозначается так [ ]. Описание: <имя спискового домена>=<имя домена
элементов списка>*. Звездочка после имени домена указывает на то, что описывается
список, состоящий из объектов соответствующего типа. Рекурсивное определение
списка: Список является рекурсивным составным объектом, состоящим из двух
частей. Структура вида [H|T] является списком, если Н – голова списка – первый
элемент списка, а Т - хвост списка – все последующие элементы, являющиеся, в свою
очередь списком. Так как список является рекурсивной структурой данных, то для
работы со списками используется рекурсия. Основной метод обработки списков
заключается в следующем: отделить от списка голову, выполнить с ней какие-либо
действия и перейти к работе с хвостом списка, являющимся в свою очередь списком.
Далее у хвоста списка отделить голову и так далее до тех пор, пока список не
останется пустым. В этом случае обработку списка необходимо прекратить.
Следовательно, предикаты для работы со списками должны иметь, по крайней мере,
два предложения: для пустого списка и для непустого списка.
8. Основы программирования на Турбо-Прологе: тип данных "строки", работа
со строками. Под строкой в Прологе понимается последовательность символов,
заключенная в двойные кавычки. Строка - это набор символов. Термин "символ"
включает буквы английского и русского алфавита, цифры, символы @, $ и некоторые
другие. Длина строки не должна превышать 250 символов. Операции, обычно
выполняемые над строками, включают: объединение строк для образования новой
строки; расщепление строки для создания двух новых строк; поиск символа или
подстроки внутри данной строки. Для описания строки используется ключевое слово
string. По общепринятым нормам в Прологе создают синоним для типа string и
используют его для понятности программы. Встроенные предикаты для работы со
строками: str_len(string,integer), concat(string,string,string), frontchar(string,char,string),
frontstr(integer,string,string,string), fronttoken(string,string,string), isname(string)
9.1. Основы программирования на Турбо-Прологе: организация ввода, вывода,
работа с файлами. Обычно файлом называют именованную (то есть имеющую имя)
совокупность данных, записанных на диске. Файл состоит из компонентов
(элементов). При чтении или записи файловая переменная перемещается к
очередному компоненту и делает его доступным для обработки. Попробуем
разобраться с тем, как можно работать с файлами в Прологе. Файлы описываются в
разделе описания доменов следующим образом: file = <символическое имя
файла1>;...; <символическое имя файлаN>. Обратите внимание, что при
описании файловых доменов тип домена file располагается слева от равенства, а
символические имена файлов — справа. Их еще называют внутренними или
логическими именами файлов.
9.2. Основы программирования на Турбо-Прологе: организация ввода, вывода,
работа с файлами. Предикат openread открывает файл только для чтения. Предикат
openwrite открывает файл только для записи. Предикат openappend открывает файл
только для дозаписи в конец файла. Предикат openmodify открывает файл для чтения
и записи одновременно. Для того чтобы проверить, существует ли файл с указанным
именем в указанном месте, используется предикат existfile. Предикат deletefile
удаляет файл, указанный в качестве его единственного параметра. Предикат
renamefile изменяет имя файла, указанного в качестве его первого параметра, на имя,
указанное в качестве его второго параметра. Предикат disk позволяет задать или
узнать текущий диск и/или каталог, в зависимости от того, связан его единственный
аргумент или свободен. Предикат eof (сокращение от End Of File — "конец файла")
успешен, если достигнут конец файла, в противном случае он неуспешен. Для того
чтобы узнать текущую позицию чтения или записи в файле, либо для того, чтобы
изменить эту позицию, служит предикат filepos.
9.3. Основы программирования на Турбо-Прологе: организация ввода, вывода,
работа с файлами. Для записи данных в текущее устройство записи служит уже
знакомый нам предикат write, который до этого мы использовали для вывода
информации на монитор. Для чтения информации из активного устройства вывода —
также уже знакомые нам предикаты readln (читает строку), readint (читает целое),
readreal (читает вещественное число), readchar (читает символ), readterm (читает
терм). Имеется также предикат file_str, который целиком читает символы файла в
строку или, наоборот. Предикат filemode. Он позволяет узнать или задать режим
доступа к файлу. У этого предиката два параметра. Первый параметр —
символическое имя файла, второй параметр задает или принимает режим работы с
файлом, имя которого указано в первом параметре. Если второй параметр свободен,
то он будет означен текущим режимом работы с файлом, а если связан, то указанный
режим будет установлен. Второй параметр может принимать одно из двух значений.
Значение ноль соответствует двоичному (бинарному) режиму работы с файлом, а
значение единица — текстовому режиму. В текстовом режиме к строкам добавляются
символы возврата каретки и перевода строки. Чаще используется текстовый режим,
поскольку при работе в двоичном режиме данные можно записывать только
посимвольно.
10. Основы программирования на Турбо-Прологе: создание окон и меню.
Предикат makewindow используется для создания окна, его формат: makewindow
(номер окна, атрибуты окна, атрибуты рамки, заголовок окна, верхняя строка окна,