Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Логическое программирование. Учебно-методическое пособие к лабораторным работам

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
ВЫСШЕЕ ОБРАЗОВАНИЕ
П. В. Новиков
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ
УЧЕБНО-МЕТОДИЧЕСКОЕ
ПОСОБИЕ К ЛАБОРАТОРНЫМ
Вузовское образование
Саратов • 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).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]