Технология логического программирования. Язык Пролог. Принципиальное отличие логических языков программирования от алгоритмических языков программирования

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

родитель(иван, петр).

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

родитель(мария, иван).

родитель(василий, иван).

родитель(иван, Клавдия).

родитель(иван, пульхерия).

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

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

? - родитель(иван, клавдия).

На этот вопрос система ответит "да". На вопрос:

? - родитель(иван, петр).

система ответит "нет".

В предложениях можно использовать переменные. Так, вопрос "Кто является родителем Клавдии?" можно записать так:

? - родитель(Х, клавдия).

На этот вопрос система даст ответ:

Х=иван

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

родитель(Х, клавдия), родитель(Х, пульхерия)

означает конъюнкцию целевых утверждений:

"X - родитель Клавдии" и "X" - родитель Пульхерии".

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

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

бабушкаилидедушка(X, Z) - родитель(X, Y),

родитель(Y,Z).

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

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

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

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

Линейный Ввод Присваивание Вывод
Ветвление Условие Серия 1 Серия 2
Цикл Условие Тело цикла

Как основной алгоритм, так и вспомогательные алгоритмы могут включать основные алгоритмические структуры: линейную, разветвляющуюся и циклическую. В линейной алгоритмической структуре все команды выполняются в линейной последовательности, одна за другой.

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

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

Алгоритмы могут быть описаны различными способами:

· записаны на естественном языке;

· изображены в виде блок-схемы;

· записаны на алгоритмическом языке;

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

Для кодирования алгоритма на языке программирования необходимо знать синтаксис языка, т.е. его основные операторы, типы переменных и др. В школе знакомятся в основном с языком программирования Бейсик.

Язык программирования Basic (Beginner's All-purpose Symbolic Instruction Code - многоцелевой язык для начинающих) был разработан в 1964 году. Языки программирования, в том числе и Basic развиваются, обогащаются новыми возможностями, и в результате возникают различные версии языка (Бейсик-Агат, MSX-Basic, QBasic, VisualBasic).

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

В формат операторов, кроме ключевых слов, входят переменные и арифметические выражения. Переменные бывают различных типов, тип переменной определяет, какие значения может принимать эта переменная. В Бейсике переменные могут быть следующих типов: целые (А% = 5), вещественные (А = 3.14), символьные (А$ = "информатика") и массивы DIM А(M, N). Массивы представляют собой одномерные или двумерные таблицы.

Команда Формат оператора
Ввод данных INPUT <список переменных>
Команда PRINT <список переменных>
Присваивание LET <переменная> = <арифметическое выражение>
Команда ветвления IF <условие> THEN <операторы> ELSE <операторы>
Команда цикла <операторы>NEXT<переменная>
Команда цикла FOR <переменная> FROM <арифметическое выражение> TO <арифметическое выражение>

Арифметические выражения могут включать в себя: числа, переменные, знаки арифметических выражений, стандартные функции и круглые скобки. Например, арифметическое выражение, которое позволяет определить величину гипотенузы

прямоугольного треугольника, будет записываться следующим образом: SQR (А*А + В*В).

Стандартные функции позволяют вычислить значения математических функций, например

стандартная функция SIN (X) позволяет вычислить значения математической функции sinх.

Вспомогательные алгоритмы реализуются на Бейсике с помощью подпрограмм. Для перехода на подпрограмму используется специальный оператор, его формат: GOSUB <номер строки>. Возврат из подпрограммы реализуется с помощью оператора RETURN.

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

Билет №3