Лабораторная работа № 5. Программирование на языке ПРОЛОГ
Программирование на языке ПРОЛОГ
1. Изучите главное меню оболочки Turbo-Prolog. (см. пояснения по выполнению лабораторной работы). 2. Научитесь открывать программы-примеры и запускать их. 3. Наберите первую программу на Прологе под названием «Привет, мир!» (см. пояснения к работе). 4. Изучите основные блоки программы на Прологе. Определите, какие программные блоки обязательны, а какие – нет. 5. Наберите программу «непарные страны Европы», сравните получаемый ответ с ответом других студентов. Он должен быть одинаковым для всех. 6. Возьмите задание 2 контрольной работы для варианта 10 и попробуйте решить его. ПОДСКАЗКА: в папке «Примеры» (EXAMPLES) можно отыскать похожую задачу и слегка видоизменить её. 7. Найдите в пояснениях к работе пример задачи на поиск факториала. Наберите её и решите подобную задачу для вычисления 10! 8. Обратитесь к преподавателю для получения дополнительных упражнений по Прологу, зависящих от вашего направления обучения (конструирование или технология).
Пояснения по выполнению лабораторной работы № 5 Главное меню Турбо-Пролога включает в себя 7 опций (команд) в верхней части экрана. Первая буква названия каждой из команд выделена при помощи увеличенной яркости. Выделение означает, что для задания команды достаточно нажать лишь первую букву ее названия. Команды относятся к 7 функциям, описываемым в меню Турбо-Пролога: 1. Запуск программы на счет (Run) 2. Трансляция программы (Compile) 3. Редактирование текста программы (Edit) 4. Задание опций компилятора (Options) 5. Работа с файлами (Files) 6. Настройка системы в соответствии с индивидуальными потребностями (Setup) 7. Выход из системы (Quit)
Существует два способа задания команд. Первый требует нажатия клавиши, соответствующей первой букве названия выбранной команды. Так, для выбора команды Edit необходимо нажать Е. Для окончания работы с командой используется клавиша Esc. Второй способ состоит в перемещении по меню при помощи стрелок; переход к работе с выбранной командой осуществляется нажатием Enter. Главный экран содержит четыре окна (рис. 22.). В левом верхнем углу располагается окно редактора Турбо-Пролога (Editor), в правом верхнем углу – окно диалога (Dialog), в левом нижнем – окно сообщений (Message), в правом нижнем – окно трассировки (Trace).
Run Compile Edit Options Files Setup Quit
Рис. 22. Вид главного экрана.
После ввода программы экран компьютера должен выглядеть так, как это показано на рисунке. Для того чтобы запустить ее, сначала требуется нажать клавишу Esc. Курсор редактора при этом исчезнет, а курсор главного меню укажет на команду Edit. Далее следует задать команду Run. Результат работы программы - в окне диалога Dialog. Базовое понятие языка ПРОЛОГ – это предикат, или отношение между объектами (доменами). Имена объектов записываются с маленькой буквы, если это константы, и с большой буквы, если это переменные. Отдельно выделенный предикат называется фактом, например, likes(john,camera). likes(tom,computer). likes(kathy,X). Первые два предиката likes описывают отношение объектов john и tom к объектам camera и computer, а третий предикат likes описывают отношение объекта kathy к неизвестному объекту. Программа, написанная на Турбо-Прологе, состоит из 5 разделов (есть необязательные!), представленных в таблице 5.
Таблица 5.
Раздел domains содержит определения доменов, которые описывают различные классы объектов. Имеется 6 встроенных типов доменов, представленных в таблице 6. Для рассмотренных ранее фактов в разделах domains и predicates должны появиться такие описания: domains person, things = symbol predicates likes(person, things)
Таблица 6.
Можно не описывать в разделе domains домены person, things. Тогда в разделе predicates необходимо сделать следующее описание: predicates likes(symbol, symbol)
Раздел database содержит утверждения динамической базы данных (может быть опущен). Раздел predicates служит для описания используемых предикатов. Раздел goal содержит формулировку задачи, записанную как внутренняя цель (чаще задачи формулируются как внешние цели). В разделе clauses содержаться данные и знания, описывающие предметную область (факты и правила). Кроме фактов для описания знаний используются правила. Согласно синтаксису Пролога, правила состоят из головы (предикат Вn) и тела (предикаты А1 Ù А2 Ù … Ù Аm). Тело записывается в виде последовательности предикатов, отделенных друг от друга запятыми, а символ ←;заменяется на:-, т.е. правило имеет вид Вn:- А1, А2, …Аm. С точки зрения математической логики предикат Вn истинен, если при каком-либо сочетании значений доменов истинны все предикаты А1 Ù А2 Ù … Ù Аm. Все знания на языке Пролог состоят из набора фактов и правил. Каждая задача формулируется, как цель (goal), которую необходимо достигнуть.
Пример. Известно, что определенные страны Европы имеют общие между собой границы, в то время как другие их не имеют. Предикатом для предоставления этого отношения служит border(country, country)
Тот факт, что Германия в Франция имеют общую границу, можно представить в виде утверждения border(“France”, “Germany”)
Франция с Германией имеют общую границу, так же как и Франция с Испанией, и Франция с Италией. Шесть утверждений задают все возможные пары четырех выбранных европейских стран: euro_pair(“France”, “Germany”) euro_pair (“France”, “Spain”) euro_pair(“France”, “Italy”) euro_pair(“Germany”, “Spain”) euro_pair(“Germany”, “Italy”) euro_pair(“Spain”, “Italy”)
Утверждения для стран с общей границей выглядят так: border(“France”, “Germany”) border(“France”, “Spain”) border(“France”, “Italy”)
Предположим теперь, что вы хотите определить, какие из стран не имеют общей границы. Отрицание предиката border задается при помощи предиката not: not(border (country1, country2))
Этот предикат, используемый как цель, выдает все пары не граничащих друг с другом стран.
Итак, полный текст программы:
/*Программа “Пары стран Европы” */
domains
country = symbol
predicates
euro_pair (country, country) border(country, country) find_non_border_pair
goal
find_non_border_pair.
clauses
/* факты*/
euro_pair(“France”, “Germany”). euro_pair(“France”, “Spain”). euro_pair(“France”, “Italy”). euro_pair(“Germany”, “Spain”). euro_pair(“Germany”, “Italy”). euro_pair(“Spain”, “Italy”).
border(“France”, “Germany”). border(“France”, “Spain”). border(“France”, “Italy”).
/*правила*/
find_non_border_pair:- euro_pair(X,Y), not(border (X,Y)), write(X,” -“, Y).
|