Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Логическое программирование. Учебно-методическое пособие к лабораторным работам
.pdf
ВЫСШЕЕ ОБРАЗОВАНИЕ
П. В. Новиков
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ
УЧЕБНО-МЕТОДИЧЕСКОЕ
ПОСОБИЕ К ЛАБОРАТОРНЫМ
РАБОТАМ
Вузовское образование
Саратов • 2017

УДК 004.4
Н73
ББК 32.97
Н73
Рецензенты:
кафедра «Компьютерные системы управления» МГТУ «Станкин»;
профессор, доктор технических наук, научный консультант
НИИ «Аргон» А. Ф. Кондрашов.
Новиков, П. В.
Логическое программирование [Электронный ресурс] : учебно-
методическое пособие к лабораторным работам / П. В. Новиков. — Элек-
трон. дан. и прогр. (5 Мб). — Саратов: Вузовское образование, 2017. —
103 с. — (Высшее образование).
ISBN 978-5-4487-0010-1
В пособии описаны все основные синтаксические конструкции языка логического программирования ПРОЛОГ, даны теоретические разъяснения особенностей логического программирования, приведены примеры логических
программ, представлены разнообразные варианты задач и упражнений на
составление ПРОЛОГ-программ различной трудности.
Пособие предназначено для студентов специальностей «Программное
обеспечение вычислительной техники и автоматизированных систем», «Программная инженерия», «Вычислительная техника, системы, комплексы и сети», а также для всех изучающих программирование. Знакомство с основными принципами логического программирования расширяет кругозор и существенно повышает квалификацию программиста.
Учебное электронное издание
© Новиков П. В., 2017
© ООО «Вузовское образование», 2017

Редактор Ю.Б. Захарова
Технический редактор А.В. Неверова
Корректор Е.С. Янсон
Компьютерная верстка, обложка С.С. Сизиумовой
Для создания электронного издания использовано:
Приложение pdf2swf из ПО Swftools, ПО IPRbooks Reader,
разработанное на основе Adobe Air
Подписано к использованию 10.05.2017. Объем данных 5 Мб.
Издание представлено в электронно-библиотечных системах
IPRbooks (www.iprbookshop.ru),
Библиокомплектатор (www.bibliocomplectator.ru)
Бесплатный звонок по России: 8-800-555-22-35
Тел.: 8 (8452) 24-77-97, 8 (8452) 24-77-96
Отдел продаж и внедрения ЭБС:
доб. 206, 213, 144, 145
E-mail: sale@iprmedia.ru
Отдел комплектования ЭБС:
доб. 224, 227, 208
E-mail: mail@iprbookshop.ru
По вопросам приобретения издания обращаться:
доб. 208, 201, 222, 224

4
С О Д Е Р Ж А Н И Е
Предисловие ................................................................................................... 5
Общий порядок выполнения лабораторных работ ....................................... 6
Работа №1. Факты и правила — основные конструкции языка ПРОЛОГ .... 7
Работа №2. Структурированное представление
информации на ПРОЛОГе ............................................................................. 19
Работа №3. Альтернативные доменные структуры и встроенный
механизм создания списков ......................................................................... 26
Работа №4. Рекурсивные логические программы ....................................... 32
Работа №5. Итерационные логические программы ..................................... 41
Работа №6. Программы обработки списков ................................................. 49
Работа №7. Использование отсечения в логических программах .............. 59
Работа №8. Внутренние динамические базы данных ПРОЛОГа ................ 68
Работа №9. Типовые металогические предикаты ....................................... 77
Приложение 1. Семантические сети «Родственные связи
исторических лиц» ......................................................................................... 83
Приложение 2. Семантическая таблица
«Табель о рангах XVIII века» ......................................................................... 91
Приложение 3. Семантические таблицы «Царскосельский Лицей» ........... 92
Приложение 4. Семантические структуры «астрономические таблицы» ... 97
Список использованных источников ........................................................... 103

5
Предисловие
Настоящее пособие содержит цикл лабораторных работ, предназначен-
ных для изучения языка логического программирования ПРОЛОГ. Этот ал-
горитмический язык базируется на логике исчисления предикатов 1-го по-
рядка. Компилятор (или интерпретатор) ПРОЛОГа содержит встроенный
механизм автоматического поиска решений, представляющий собой алго-
ритм резолюции вместе с алгоритмом унификации. Поэтому логические про-
граммы имеют особый, декларативный вид. Необычный подход к программированию, непривычные приёмы создания программ и незнакомая многим
теоретическая база обуславливают малую распространённость ПРОЛОГа.
Он имеет репутацию сложного языка, несмотря на его внушительные воз-
можности по решению задач символьной обработки информации, в том
числе задач так называемого искусственного интеллекта. Для преодоления
трудностей, связанных с освоением особого, присущего только ПРОЛОГу,
синтаксиса, в предлагаемом цикле каждая синтаксическая конструкция подробно изучается в отдельной работе, что позволяет постепенно и без затруднений освоить все основные конструкции логических программ. Этому
же способствует большой объём разнообразных практических заданий. Ав-
тор посчитал важным дать в приложениях большое количество фактическо-
го материала. Использование реальных, порой малоизвестных, данных
вместо искусственно выдуманных делает более осмысленным выполнение
практических заданий.
Каждая работа может быть выполнена за одно четырёхчасовое занятие,
однако самостоятельная подготовка позволяет сократить время выполнения
и без больших потерь объединить материал тематически близких 1-й и 8-й,
2-й и 3-й (дополнив их программами из 6-й), 4-й и 5-й, а также небольших по
объёму 7-й и 9-й работ. Тем самым количество учебных часов для аудиторных занятий может быть уменьшено вдвое при обучении по сокращённой
программе.
Так как пособие не охватывает всех возможных приложений логического
программирования, планируется выпуск новых пособий, посвящённых ре-
шению широкого круга прикладных задач с помощью логических программ.

6
Общий порядок выполнения лабораторных работ
1. Внимательно и детально изучить общую часть методических указаний
к лабораторной работе, предварительно ознакомившись с целью этой работы.
2. Включив компьютер, загрузить язык логического программирования
Турбо-ПРОЛОГ, запустив на выполнение файл prolog.exe, находящийся в
папке Турбо-ПРОЛОГа.
3. Набрать в окне редактора (Edit) текст примера к лабораторной работе.
Убедиться в правильности функционирования программы, изучив в процессе работы с ней новые синтаксические конструкции ПРОЛОГа. Текст примера может служить заготовкой к выполнению индивидуального задания.
4. В соответствии с вариантом задания разработать оригинальную логическую программу с использованием новых синтаксических конструкций.
5. Набрать текст созданной программы. При наборе текста следует разделять пустыми строками секции predicates, clauses и другие, а также заголовки к этим секциям. Текст внутри секции следует набирать со сдвигом для
удобства набора программы.
6. Запустить разработанную программу на выполнение, отладив её в режиме диалога. Активные окна следует полностью раскрывать (Zoom — F5).
7. Убедившись в правильности работы программы, продемонстрировать
её успешное функционирование преподавателю.
8. После того как выполнение лабораторной работы зачтено преподавателем, следует распечатать на принтере текст программы с примерами её
функционирования.
9. Сохранённый файл следует удалить с жёсткого диска.
10. Файл с текстом программы следует сохранить на мобильном носите-
ле, присвоив оригинальное ему имя для дальнейшей работы с ним на домашнем компьютере.
11. Для переноса на домашний компьютер языка Турбо-ПРОЛОГ возможно переписать на дискету архивный самораспаковывающийся файл
tprolog.exe.
12. Оформив отчёт, защитить лабораторную работу у преподавателя.
Все задания могут быть выполнены на алгоритмическом языке Visual
Prolog.

7
Р а б о т а №1. ФАКТЫ И ПРАВИЛА —
ОСНОВНЫЕ КОНСТРУКЦИИ ЯЗЫКА ПРОЛОГ
Цель работы — ознакомление с основными понятиями языка логическо-
го программирования ПРОЛОГ; изучение главных атрибутов программ на
языках Турбо-ПРОЛОГ и Visual Prolog.
Общие сведения
Основной конструктивный элемент любой логической программы —
утверждения, называемые по традиции клаузы (clauses). Каждое утвер-
ждение может состоять из посылки (антецедента) и заключения (консе-
квента), связанных импликативной связью (из посылки следует заключе-
ние), например:
«Если геометрическая фигура — квадрат, то она — ромб».
или
«Каждый имеет водительские права, если работает шофёром».
Посылка утверждения в логическом программировании может быть
сложной, то есть представлять собой конъюнкцию элементарных посы-
лок или дизъюнкцию конъюнкций элементарных посылок. Каждая элементарная посылка является элементарным (атомарным) суждением.
Заключение утверждения в логическом программировании может быть
только элементарным суждением.
В соответствии с принятой в логическом программировании терминоло-
гией, заключение утверждения называется головой клаузы, а посылка —
телом клаузы. Всякое элементарное суждение называется целью.
Структурно каждое элементарное суждение состоит из связанных между
собой субъекта (предмета суждения) и предиката (свойства суждения), то
есть представляет собой предикатную конструкцию, зависящую либо от
переменных (общее суждение), либо от констант (единичное суждение).
Предикат есть логическая функция, принимающая значения «истина»
или «ложь» в зависимости от значений её аргументов. Количество и тип ар-
гументов могут быть любыми.

8
В логической программе на языке Турбо-ПРОЛОГ или на языке Visual
Prolog все утверждения должны располагаться в разделе clauses, а преди-
каты, из которых состоят клаузы, должны быть предварительно описаны в
разделе predicates. В этом разделе перечисляются имена предикатов с типами всех аргументов, от которых предикаты зависят.
Клаузальная форма логики, принятая как теоретическая основа для ло-
гического программирования, предполагает обратное написание клауз, ко-
гда вначале записывается голова (заключение) клаузы, затем логическая
связка , (то есть if), а затем тело клаузы (посылка). Так, утверждение
«
Число — чётное, если нацело делится на два
будет выглядеть так:
A B.
Здесь голова клаузы А — суждение «Число — чётное», выраженное пре-
»
дикатом чётное(Х), а тело клаузы В — суждение «Число нацело делится на
два», выраженное предикатом делится_на_два(Х), то есть:
чётное(Х
При использовании латинского алфавита (например, в переводе на ан-
глийский) это утверждение будет иметь вид:
even(X) if divide_by_two(X).
Именно так выглядят клаузы, из которых состоит логическая программа.
Структура клауз может быть различна. Полная клауза, содержащая как
голову, так и тело, называется правило. Такова вышеприведённая клауза.
В случае же, если клауза представляет собой голову без тела, такая кла-
уза называется факт. Например, утверждение
«Евклид — математик»
)
делится_на_два(Х
).
на языке клауз представляется в виде:
математик(«Евклид»)
и становится фактом логической программы:
mathematic(”Евклид”).
В то же время утверждение
«
Прямые
a и b
пересекаются в точке
C»

9
может быть представлено как клауза
точка_пересечения_прямых(a, b, ’C’)
и также станет фактом:
point_of_lines_intersection(a, b, ’C’).
Следует учесть, что логическую функцию «конъюнкция» в теле клаузы
теоретиками принято представлять запятой («,»). В логических программах
допускается как запятая, так и общеизвестное and. Функция логического
следствия «импликация» на теоретическом языке клауз обозначается символом «», а в логической программе — символом «:─» , который заменяет
традиционное if. Так, например, утверждение
«
Если фигура — ромб и прямоугольник, то она — квадрат
»
выглядит как:
квадрат(Х) ромб(Х), прямоугольник(Х).
Его представляет правило:
square(X) if rhombus(X) and rectangle(X).
или
square(X) :─ rhombus(X), rectangle(X).
Если же утверждение имеет сложное заключение, то внешний вид клаузы и
её интерпретация в логической программе изменятся. Так, утверждение
«Если электромашина имеет ротор (подвижную обмотку) и статор (не-
подвижную обмотку), то это электродвигатель или электрогенератор»
в клаузальной форме представляется в виде:
электродвигатель(Х), электрогенератор(Х) электромашина(X),
имеет_ротор(Х),
имеет_статор(Х).
При этом запятая в голове клаузы теоретически означает дизъюнкцию
(соединительное или).
Однако на практике, в логической программе голова каждой клаузы может состоять только из одного элементарного суждения (это так называемые хорновские клаузы). Тогда рассматриваемая клауза должна быть заменена на две клаузы (в общем случае — на несколько клауз) с простым заключением:

10
электродвигатель(Х) электромашина(X), имеет_ротор(Х),
имеет_статор(Х).
электрогенератор(Х) электромашина(X), имеет_ротор(Х),
имеет_статор(Х).
Эти клаузы в логической программе имеют вид:
electro_engine(X) :─ electro_mashine(X), have_a_rotor(X), have_a_stator.
electro_generator(X) :─ electro_mashine(X), have_a_rotor(X), have_a_stator.
Аналогично можно рассмотреть утверждение:
«
Если
DU
либо
и
DV
(DU+DV)
есть производная функции
есть производная функции
есть производная функции
U по
V по
переменной
(U+V) по
переменной
X, то
переменной
X,
X,
либо
либо
либо
(DU-DV)
(DU*V+U*DV)
есть производная функции
есть производная функции
(DU*V-U*DV)/(V*V)
(U-V) по
(U*V) по
есть производная функции
переменной
переменной
(U/V) по
X,
X,
переменной
X».
В клаузальной форме представляется в виде:
производная_функции_(U+V)_по_переменной_X_есть_(DU+DV),
производная_функции_(U-V)_по_переменной_X_есть_(DU-DV),
производная_функции_(U*V)_по_переменной_X_есть_(DU*V+U*DV),
производная_функции_(U/V)_по_переменной_X_есть_(DU*V-U*DV)/(V*V)
производная_функции_U_по_переменной_X_есть_DU,
производная_функции_V_по_переменной_X_есть_DV.
А в логической программе будет следующим набором из четырёх клауз:
diff(plus(U, V), X, plus(DU, DV)) :- diff(U, X, DU), diff(V, X, DV).
diff(minus(U, V), X, minus(DU, DV)) :- diff(U, X, DU), diff(V, X, DV).
diff(mult(U, V), X, plus(mult(DU, V), mult(U, DV))) :- diff(U, X, DU), diff(V, X, DV).
diff(div(U, V), X, div(minus(mult(DU, V), mult(U, DV)), mult(V, V))) :-
diff(U, X, DU), diff(V, X, DV).
Здесь plus(,), minus(,), mult(,) и div(,) есть функторы, означающие действия
сложение, вычитание, умножение и деление аргументов (см. работу №2).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
