71
Министерство образования и науки Российской Федерации федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский государственный университет печати имени Ивана Федорова Д.И. Попов, О.Ю. Лазарева Системы искусственного интеллекта Лабораторный практикум для студентов, обучающихся по направлениям: 09.03.01 (230100.62) — Информатика и вычислительная техника Москва 2014

Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

Embed Size (px)

Citation preview

Page 1: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

Министерство образования и науки Российской Федерации федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования Московский государственный университет печати имени Ивана Федорова

Д.И. Попов, О.Ю. Лазарева

Системы искусственного интеллекта

Лабораторный практикум

для студентов, обучающихся по направлениям: 09.03.01 (230100.62) — Информатика

и вычислительная техника

Москва 2014

Page 2: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

2

УДК 004.8 ББК 65.422.5

П 58 Попов Д.И., Лазарева О.Ю. Системы искусственного интеллекта : Лабораторный практи-

кум / Д.И. Попов, О.Ю. Лазарева ; Моск. гос. ун-т печати име-ни Ивана Федорова. — М. : МГУП имени Ивана Федорова, 2014. — 150 с

Лабораторные работы тесно связаны с программой дисциплины

«Системы искусственного интеллекта». Это серия работ по про-граммированию на языке Prolog в программной среде Turbo Prolog.

УДК 004.8 ББК 65.422.5

© Попов Д.И., Лазарева О.Ю., 2014

© МГУП имени Ивана Федорова, 2014

Page 3: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

3

Оглавление

Введение .....................................................................................................5 Лабораторная работа № 1. Введение в логическое программирование на языке Prolog .....................................................7 Теоретическая часть ...............................................................................7 Задание ..................................................................................................17 Контрольные вопросы..........................................................................18

Лабораторная работа № 2. Арифметические операции, ввод данных пользователем, разветвление ......................................19 Теоретическая часть .............................................................................19 Задание ..................................................................................................23 Контрольные вопросы..........................................................................24

Лабораторная работа № 3. Организация повторений в языке Prolog .........................................................................................25 Теоретическая часть .............................................................................25 Задание ..................................................................................................30 Контрольные вопросы..........................................................................30

Лабораторная работа № 4. Работа со списками ...............................31 Теоретическая часть .............................................................................31 Задание ..................................................................................................43 Контрольные вопросы..........................................................................44

Лабораторная работа № 5. Работа с файловой системой ...............45 Теоретическая часть .............................................................................45 Задание ..................................................................................................49 Контрольные вопросы..........................................................................50

Лабораторная работа № 6. Создание динамических баз данных ...............................................................................................51 Теоретическая часть .............................................................................51 Задание ..................................................................................................58 Контрольные вопросы..........................................................................58

Page 4: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

4

Лабораторная работа № 7. Создание экспертных систем ..............59 Теоретическая часть .............................................................................59 Задание ..................................................................................................63 Контрольные вопросы..........................................................................63

Лабораторная работа № 8. Решение логических задач ..................64 Теоретическая часть .............................................................................64 Задание ..................................................................................................67 Контрольные вопросы..........................................................................67

Библиографический список ....................................................................68

Page 5: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

5

Введение

Данные лабораторные работы подготовлены применительно к программе дисциплины «Системы искусственного интеллекта» и представляют собой серию лабораторных работ по программиро- ванию на языке логического программирования Prolog в про- граммной среде Turbo Prolog. Работа предназначена для студентов, обучающихся по направлению 09.03.01 — «Информатика и вы- ислительная техника».

Приобретаемые компетенции: Владение культурой мышления, способность к обобщению,

анализу, восприятию информации, постановке цели и выбору пу- тей ее достижения (ОК-1).

Осознание сущности и значения информации в развитии современного общества; владение основными методами, способа- ми и средствами получения, хранения, переработки информации (ОК-11).

Владение методиками использования программных средств для решения практических задач (ПК-2).

Владение методиками разработки интерфейсов «человек — электронно-вычислительная машина» (ПК-3).

Владение методиками разработки компонентов программных комплексов и баз данных, умение использовать современные ин- струментальные средства и технологии программирования (ПК-5).

Цели данных лабораторных работ: обучение практическим навыкам программирования на языке Prolog — одном из самых распространенных языков логического программирования. Логи- ческое программирование — парадигма программирования, осно- ванная на автоматическом доказательстве теорем с использованием механизмов логического вывода информации на основе заданных фактов и правил вывода. Язык Prolog и логическое программиро- вание широко используются для создания баз знаний, экспертных систем и исследований в сфере искусственного интеллекта на ос-

Page 6: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

6

нове логических моделей баз знаний и логических процедур выво- да и принятия решений.

Поставленные задачи: освоение методов и принципов про- граммирования на языке Prolog и получения навыков работы со средой Turbo Prolog.

В результате выполнения лабораторных работ студент должен: знать: методологию программирования и основные принципы

разработки программного обеспечения на языке логического про- граммирования Prolog;

уметь: использовать программную среду Turbo Prolog для раз- работки интеллектуальных систем;

владеть: методами и средствами разработки программного обеспечения на языке Prolog.

Page 7: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

7

Лабораторная работа № 1. Введение в логическое программирование

на языке prolog

Продолжительность выполнения лабораторной работы: 4 ак. часа.

Целью лабораторной работы является знакомство со средой Turbo Prolog и основами программирования на языке Prolog.

Теоретическая часть

Prolog (фр. Programmation en Logique) — это язык логического программирования, основанный на языке предикатов математиче- ской логики дизъюнктов Хорна — подмножестве логики предика- тов первого порядка. Существует несколько различных сред и компиляторов для программирования на языке Prolog, например: • Turbo Prolog — язык и система логического программирова-

ния, разработанные компанией Borland в начале 1980-х гг.; • Visual Prolog — объектно-ориентированное расширение языка

программирования PDC Prolog, развивавшегося из Turbo Prolog, а также система визуального программирования;

• SWI-Prolog — открытая реализация языка Prolog. В данных лабораторных работах будет описываться работа в

среде Turbo Prolog. Программа, написанная на языке Prolog, состоит из нескольких

основных частей: раздел доменов, раздел базы данных, раздел предикатов, раздел цели и раздел утверждений. Начала этих разде- лов отмечаются ключевыми словами domains, database, predi- cates, goal и clauses соответственно. Раздел domains содержит определения доменов, которые описывают различные классы объ- ектов (типы аргументов пользователя), которые используются в

Page 8: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

8

программе кроме стандартных доменов. Раздел database содержит утверждения базы данных, которые являются предикатами дина- мической базы данных. Раздел predicates служит для описания используемых программой предикатов. В разделе goal формули-руется назначение создаваемой программы. Раздел clauses — это ядро программы, в него заносятся факты и правила, известные априорно (листинг 1.1 и рис. 1.1). Некоторые из этих разделов (domains, database, goal) могут быть пропущены в программе. Комментарии в языке Prolog обрамляются символами /* и */.

Листинг 1.1

Пример программы «Hello, World!»

predicates hello goal hello. clauses hello :- write("Welcome to Turbo Prolog!"),nl.

Рис. 1.1. Результат работы программы «Hello, World!»

Приведем пример описания доменов и предикатов. Рассмотрим отношение «любит» между двумя объектами: likes("Mary", ap-

Page 9: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

9

ples). Здесь likes является предикатом (термом предиката), а Mary и apples — объектами этого предиката. Turbo Prolog требует указания типов объектов для каждого предиката программы. Для этого в разделе predicates необходимо задать тип объектов каждо- го из предикатов, например: likes(symbol, symbol). Это описание означает, что оба объекта предиката likes относятся к типу symbol, который является одним из базисных типов в Prolog (табл. 1.1).

Таблица 1.1

Базисные типы в Turbo Prolog

Тип данных Ключевое слово Диапазон значений Примеры

использования

Символы сhar Все возможные символы 'A', 'b', '#' Целые числа integer от – 32768 до 32767 – 37, 5134, – 32750Действительные числа real от – 263 до 263–1 – 41245, 4578,

Строки string Последовательность символов (не более 250) "Hello!", "1+2=3"

Символические имена symbol

1. Последовательность букв, цифр и знака подчеркивания; первый символ — строчная буква. 2. Последовательность любых символов, заключенная в кавычки

hello_world

"Hello world!"

Файлы file Допустимое в DOS имя файла Test.txt

Prolog позволяет конструировать свои собственные типы объ-

ектов из базисных типов доменов. Например, в разделе программы domains могут появиться такие описания:

domains person, thing = symbol predicates likes (person, thing)

Page 10: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

10

Как было сказано ранее, в раздел clauses заносятся факты и прави- ла, причем каждый факт или правило завершается символом «точка»:

clauses likes("John",camera). likes("Tom",computer). likes("Kathy",computer). likes("Mary",apple). Рассмотрим особенности использования целей (goal). Цели бы-

вают внутренние и внешние. Внутренние цели — это цели поис- ка, которые задаются в самой программе. Цель при этом может состоять из нескольких подцелей, разделенных запятой (логиче- ский союз «И» ) или точкой с запятой (логический союз «ИЛИ»). Завершается цель точкой.

Для вывода на экран во внутренних целях используется встро- енный предикат write, аргументами которого могут быть строко- вые константы (заключенные в кавычки) и имена переменных; та- кие аргументы можно произвольно комбинировать. Встроенная операция nl (сокращение от «new line» — англ. новая строка) по- зволяет осуществлять перевод курсора на новую строку. Пример программы с внутренней целью представлен в листинге 1.2.

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

Листинг 1.2 Пример программы с внутренней целью

domains person, thing = symbol predicates likes (person, thing) clauses likes ("John",camera). likes ("Tom",computer). likes ("Kathy",computer). goal write ("Что же любит Tom?"), nl, likes ("Tom", X), write ("Tom любит", X).

Page 11: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

11

На рис. 1.2 представлен скриншот программы Turbo Prolog с активным редактором кода (Edit). Выполнить введенный код мож- но, выбрав пункт Run (ALT+R). Трансляция задается автоматиче- ски, т.е. нет необходимости прибегать к помощи специальной команды Compile. Результат работы программы представлен на рис. 1.3.

Рис. 1.2. Скриншот программы Turbo Prolog с активным редактором кода (Edit)

Рис. 1.3. Результат работы программы.

Рассмотрим факт student ("Иванов", 14, 05, 1990). При таком за- дании факта оказывается непонятным назначение последних трех

Page 12: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

12

объектов, которые представляют собой дату рождения студента Иванова. Более определенно описать этот объект можно следую- щим образом: student ("Иванов", birthday(14, 05, 1990)). Объект, представляющий собой другой объект или совокупность объектов, называется составным объектом (листинг 1.3 и рис. 1.4).

Листинг 1.3

Пример программы с составным объектом

domains date=birthday(integer, integer, integer) predicates student (symbol, date) clauses student ("Иванов",birthday (14, 05, 1990)). student ("Петров",birthday (30, 12, 1991)). student ("Сидоров",birthday (29, 05, 1991)). goal student ("Иванов",X), write("Дата рождения Иванова: ",X).

Рис. 1.4. Пример программы с составным объектом

Если необходимо определить только год рождения студента, то цель будет выглядеть так: student ("Иванов", birthday (_,_,Y)),

Page 13: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

13

write("Год рождения Иванова: ",Y). Обратите внимание, что пере- менная, в определении значения которой нет необходимости, на- зывается анонимной переменной и обозначается знаком подчерки- вания (рис. 1.5).

Рис. 1.5. Пример программы с анонимной переменной

Представление данных часто требует наличия большого числа структур. В Prolog эти структуры должны быть описаны с помо- щью альтернативного описания доменов. Для разделения альтер- нативных доменов используется точка с запятой (листинг 1.4).

Листинг 1.4

Пример программы с альтернативным описанием доменов

domains thing = misc_thing(whatever); book(author,title); record(artist, al-

bum,type) person, whatever, author, title, artist, album, type = symbol predicates owns (person, thing) clauses owns ("Иванов", misc_thing("Piano")). owns ("Петров", book("J.R.R. Tolkien","Return of the King")). owns ("Сидоров", record("Nightwish","Nemo","metal")).

Page 14: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

14

Рис. 1.6. Пример программы с альтернативным описанием доменов

Если в коде программы не заданы цели (goal), то при нажатии ALT+R курсор перейдет в окно диалога (dialog), где их также можно ввести и сразу же увидеть результат (рис. 1.6).

Рассмотрим, как осуществляется логический вывод. Унифика- цией называется отождествление объектов Prolog при сопоставле- нии предиката с фактами и правилами. Если подобное отождеств- ление выполнено, то считается, что унификация завершена успешно. При этом свободные переменные доказываемого предиката приоб- ретают конкретные значения. Этот процесс называется конкрети- зацией.

Листинг 1.5

Пример программы с логическим выводом

predicates father(symbol). mother(symbol). man(symbol). clauses father(bob). mother(ann). man(X):- father(X).

Page 15: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

15

Результат логического вывода (листинг 1.5) зависит от вида вопроса. Если вопрос содержит только константы, то он называет- ся общим, и ответ на него будет «да» или «нет» в зависимости от результатов сопоставления с фактами и правилами программы (рис. 1.7).

Если вопрос содержит переменные, то в процессе сопоставле- ния они будут конкретизированы. Полученные значения будут вы- ведены на экран (рис. 1.8), в противном случае будет дан ответ «нет».

Если в программе, приведенной в листинге 1.5, сделать за- прос: man(X), то предикат man(X) сопоставляется с фактами базы знаний, после чего сопоставляется с головой правила man(X). Поскольку сопоставление успешно, то переменная X конкретизи- руется значением "bob". Выполняется доказательство цели man(bob). Для доказательства изучается предикат правой части правила father(bob). Этот предикат сопоставляется с фактом базы данных. При сопоставлении с фактом father(bob) унификация за- вершается успешно, т.е. предикат father(bob) принимает значение «истина», голова правила man(bob) принимает значение «исти- на». При этом переменная X конкретизируется значением "bob". В конце работы программы на экране выдается сообщение X ="bob".

Рис. 1.7. Результат логического вывода (вопрос содержит только константу)

Page 16: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

16

Рис. 1.8. Результат логического вывода (вопрос содержит переменную)

В листинге 1.6 представлен код программы, полностью задаю- щей ближайшие родственные связи (рис. 1.9).

Листинг 1.6

Пример программы, задающей ближайшие родственные связи

domains s = symbol predicates parent(s,s) female(s) male(s) mother(s,s) father(s,s) ancestor(s,s) child(s,s) clauses parent(pam,bob). parent(tom,bob). parent(tom,liz). par-

ent(bob,ann). parent(bob,pat). parent(olga,pat). parent(olga,svetlana). par-

ent(pat,jim). female(pam). female(olga). female(liz). female(ann). fe-

male(pat).

Page 17: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

17

Окончание Листинга 1

male(tom). male(bob). male(jim). child(Y,X) :- parent(X,Y). mother(X,Y) :- parent(X,Y), female(X). father(X,Y) :- parent(X,Y), male(X). ancestor(X,Z) :- parent(X,Z). ancestor(X,Z) :- parent(X,Y), ancestor(Y,Z).

Рис. 1.9. Результат работы программы «Родственные связи»

Задание

1. Написать программу — «Hello, world!». 2. Написать в Turbo Prolog программу с произвольными пре-

дикатами, которая будет включать составные объекты и альтерна- тивные домены.

3. Описать отношения для следующих комбинаций «субъек- ты ― предметы»: субъекты ― марки автомобилей.

4. Реализовать пример родственных отношений (не менее 7 предикатов, не менее 15 правил, и 2–3 цели (например, «у кого мама — Ольга?»).

5. Определить родственное отношение «grandmother» («ба- бушка»).

Page 18: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

18

Контрольные вопросы

1. Какие среды и компиляторы для программирования на языке Prolog вы знаете?

2. Какие разделы существуют в программе на языке Prolog? 3. Какие базисные типы существуют в языке Prolog? 4. Что такое составной объект в программе на языке Prolog? 5. Зачем нужны альтернативные домены в программе на язы-

ке Prolog?

Page 19: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

19

Лабораторная работа № 2. Арифметические операции,

ввод данных пользователем, разветвление

Продолжительность выполнения лабораторной работы: 4 ак. часа. Целью лабораторной работы является знакомство со способа-

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

Теоретическая часть

Выполнение арифметических операций Для выполнения арифметических операций необходимо соз-

дать соответствующие предикаты в программе на языке Prolog. Для осуществления основных арифметических действий можно воспользоваться несколькими предопределенными операторами. Prolog может выполнять все четыре основные арифметические операции (сложение, вычитание, умножение и деление) между целыми и вещественными числами. Тип результата приведен в табл. 2.1.

Таблица 2.1

Арифметические операции

Операнд 1 Оператор Операнд 2 Результат

1 2 3 4 Целое +, –, * Целое Целое Вещественное +, –, * Целое Вещественное Целое +, –, * Вещественное Вещественное Вещественное +, –, * Вещественное Вещественное

Page 20: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

20

Окончание табл. 2.1

1 2 3 4 Целое или вещественное / Целое

или вещественное Вещественное

Целое Div (частное от деления) Целое Целое Целое Mod (остаток от деления) Целое Целое

В листинге 2.1 приведены предикаты для вычисления суммы, разности, произведения, частного двух чисел и вывод случайного числа из интервала [1, 100] (рис. 2.1).

Рис. 2.1. Пример программы, выполняющей простейшие арифметические операции

Листинг 2.1

Пример программы, выполняющей простейшие арифметические операции

domains N=integer predicates add(N,N). sub(N,N). multi(N,N). division(N,N). rand(N). clauses add(X,Y):- T=X+Y, write(X,"+",Y,"=",T), nl.

Page 21: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

21

Окончание листинга 2.1

sub(X,Y):- S=X-Y, write(X,"-",Y,"=",S), nl. multi(X,Y):- P=X*Y, write(X,"*",Y,"=",P), nl. division(X,Y):- Y<>0, R=X/Y, write(X,"/",Y,"=",R), nl. rand(N):- random(Y), N=1+Y*100, write("Random num-

ber — ",N), nl. Ввод данных пользователем Для организации ввода используются несколько стандартных

предикатов, таких как readint(X), readreal(X), readchar(X), readln(X), позволяющих ввести соответственно целое, веществен- ное число, один символ или строку символов. Дополнительно есть предикат readterm(X) для чтения любых термов, включая состав- ные объекты. Все эти предикаты могут быть переориентированы для чтения из файлов. Пример программы с пользовательским вводом (рис. 2.2) представлен в листинге 2.2.

Листинг 2.2

Пример программы с пользовательским вводом

domains X,Y,Z=integer predicates input(X,X). add(X,X,X). clauses input(X,Y):- write("Input first number: "), readint(X), write("Input second number: "), readint(Y). add(X,Y,Z):- input(X,Y), Z=X+Y, write(X,"+",Y,"=",Z), nl. goal add(X,Y,Z).

Page 22: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

22

Рис. 2.2. Пример программы с пользовательским вводом

Разветвление Язык Prolog не содержит операторов, аналогичных операторам

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

Для примера рассмотрим программу определения типа образо- вательного учреждения, которое посещает ребенок, в зависимости от его возраста, вводимого с клавиатуры (листинг 2.3 и рис. 2.3).

Листинг 2.3

Пример программы с разветвлением

domains X=integer Y=symbol predicates input(X). output(Y). go(X,Y). answer. clauses input(X):- write("Input age:"), readint(X), nl. output(Y):- write("Goes to "), write(Y).

Page 23: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

23

Окончание листинга 2.3

go(X,Y):- X<6, Y="nursery school". go(X,Y):- X>=6, X<=16, Y="school". go(X,Y):- X>16, Y="university". answer:- input(X), go(X,Y), output(Y). goal answer.

Рис. 2.3. Пример программы с разветвлением

Задание

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

2. Реализовать вычисление куба числа, вводимого пользова- телем.

3. Написать в Turbo Prolog программу, которая будет искать значение Z по введенным с клавиатуры значениям X и Y, при этом в зависимости от значения X должно происходить разветвление программы. Например, при X < 0, Z = X + Y, а при X >= 0, Z = X*Y.

Page 24: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

24

4. Написать программу, задающую отношение triangle(N, T), истинное, если T ― треугольное число с индексом N.

Контрольные вопросы

1. Как осуществляется логический вывод в программе на языке Prolog?

2. Как осуществляются арифметические операции? 3. Если к целому числу прибавить вещественное в программе

на языке Prolog, какого типа будет результат? 4. Какие операторы в языке Prolog используются для

пользовательского ввода? 5. Есть ли в языке Prolog операторы для разветвления

программы?

Page 25: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

25

Лабораторная работа № 3. Организация повторений в языке Prolog

Продолжительность выполнения лабораторной работы: 4 ак. часа.

Целью лабораторной работы является знакомство с принци-пом организации повторений в языке Prolog.

Теоретическая часть

Повторения и рекурсия Зачастую в программах бывает необходимо выполнить одну и

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

Вид правила, выполняющего повторение, следующий: repetitive_rule:- <предикаты и правила>, fail. Конструкция <предикаты и правила> в теле этого правила обо-

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

Вид правила, выполняющего рекурсию, следующий: recursive_rule:- <предикаты и правила>, recursive_rule. Последним в теле данного правила является само же правило

recursive_rule, т.е. тело правила содержит вызов самого себя. Правила повтора и рекурсии могут обеспечивать одинаковый

результат, хотя алгоритмы их выполнения неодинаковы. Каждый из них в конкретной ситуации имеет свои преимущества. Рекур- сия, например, может требовать больше системных ресурсов.

Page 26: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

26

Метод отката после неудачи Метод отката после неудачи может быть использован для

управления вычислением внутренней цели при поиске всех воз- можных ее решений. Этот метод использует предикат fail, который вызывает неуспешное завершение правила. При его срабатывании внутренние унификационные подпрограммы выполняют откат в точку возврата, и процесс повторяется до тех пор, пока последнее утверждение не будет обработано.

Использование метода отката после неудачи позволяет извле- кать данные из каждого утверждения базы данных. Добавив до- полнительные условия на значения объектов для одной или более переменных предиката, можно извлекать данные только из опре- деленных утверждений.

Например, пусть в программе в виде набора фактов хранятся сведения о нескольких городах (название города и название реки, протекающей через город). Цель — получить на экране список го- родов, стоящих на указанной реке. Ниже приведен листинг 3.1, реализующий данную программу (рис. 3.1).

Листинг 3.1

Пример программы, использующей метод отката после неудачи

predicates city (symbol, symbol) search (symbol) clauses city ("Samara","Volga"). city ("Saratov","Volga"). city ("Rostov",

"Don"). city ("Moscow","Moskva"). city ("Volgograd","Volga"). search (R):- city (C,R), write (C), nl, fail. goal write ("River? "), readln (River), nl, write ("Cities on river ",

River," :"), nl, search (River).

Page 27: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

27

Рис. 3.1. Пример программы, использующей метод отката после неудачи

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

Листинг 3.2

Пример программы, задающей ориентированный граф

domains point = symbol predicates arc_(point, point) line_(point, point) tr(point, point, point) clauses arc_(a, c). arc_(b, c). arc_(c, d). arc_(d, a). arc_(d, e). arc_(c, b). arc_(a, f). line_(A, B) :- arc_(A, B), arc_(B, A). tr(X, Y, Z) :- arc_(X, Y), arc_(Y, Z), arc_(Z, X). goal arc_(a, TOP), write("Top 'a' has an arc with top '", TOP, "'"),

nl, fail.

Page 28: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

28

Рис. 3.2. Результат программы «Ориентированный граф»

Метод отсечения и отката В некоторых ситуациях необходимо иметь доступ только к оп-

ределенной части данных. Метод отсечения и отката может быть использован для фильтрации данных, выбираемых из базы утвер- ждений. Задавая условие на окончание просмотра базы данных, можно получить только требуемую часть информации. Для этих целей Prolog имеет встроенный предикат cut («отсечение»), кото- рый обозначается символом восклицательного знака (!). Рассмот- рим программу (листинг 3.3), в которой имеется база утверждений, содержащая несколько имен. Цель — выдать список этих имен до имени Diana включительно (рис. 3.3).

Листинг 3.3

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

predicates name (symbol). сhoice. clauses name ("Mary"). name ("Bob"). name ("Diana"). name ("John").

name ("Peter"). choice:- name (N), write (N), nl, N="Diana", !. goal write ("Names before Diana: "), nl, choice.

Page 29: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

29

Рис. 3.3. Пример программы, использующей метод отсечения и отката

Рекурсия Правило, содержащее само себя в качестве компонента, назы-

вается правилом рекурсии. В качестве примера рассмотрим про- грамму расчета факториала, использующую рекурсию (листинг 3.4 и рис. 3.4).

Листинг 3.4 Пример программы с рекурсией

predicates fact(integer, integer) clauses fact(0,1):- !. fact(N,X):- M=N-1, fact(M,Y), X=Y*N.

Рис. 3.4. Пример программы с рекурсией

Page 30: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

30

Задание

1. Написать в Turbo Prolog три программы с произвольными предикатами, в которых будет использовать метод отката после неудачи, метод отсечения и отката и рекурсия соответственно.

2. Реализовать в Turbo Prolog ориентированный граф. 3. Описать граф. Задать отношения, позволяющие определить

наличие в графе путей между произвольной парой вершин. 4. Описать граф. Задать отношения, позволяющие определить

наличие в графе многоугольников с заданным числом сторон (на- пример, четырехугольников).

Контрольные вопросы

1. Какие способы организации повторений существуют в Prolog?

2. Что такое рекурсия? 3. Как выглядят в общем виде правило, выполняющее повто-

рения, и правило, выполняющее рекурсию? 4. В чем заключается метод отката после неудачи? 5. В чем заключается метод отсечения и отката?

Page 31: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

31

Лабораторная работа № 4. Работа со списками

Продолжительность выполнения лабораторной работы: 6 ак. часа. Целью лабораторной работы является знакомство с методами

задания, вывода и работы со списками в языке Prolog.

Теоретическая часть

Задание и вывод списков Prolog поддерживает связанные объекты, называемые списка-

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

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

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

Совокупность элементов списка заключается в квадратные скобки — [ ], а друг от друга элементы списка отделяются запяты- ми. Количество элементов в списке называется его длиной. Спи- сок может также содержать всего один элемент или даже не со- держать элементов вовсе. Список, не содержащий элементов, называется пустым, или нулевым.

Непустой список можно рассматривать как состоящий из двух частей: первый элемент списка — его голова, а остальная часть списка — хвост. Голова является одним из элементов спи-

Page 32: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

32

ска, а хвост — это список сам по себе. Голова списка представля- ет собой отдельное неделимое значение; хвост же — это список, составленный из того, что осталось от исходного списка в ре- зультате «усекновения головы». Если, например, список состоит из одного-единственного элемента, то его можно разделить на голову, которой будет этот самый единственный элемент, и хвост, являющийся пустым списком (табл. 4.1).

Таблица 4.1

Списки в языке Prolog

Список Голова Хвост [1,2,3,4,5] 1 [2,3,4,5] ['a','b','c'] 'a' ['b','c'] [hello] hello []

Чтобы использовать в программе список, необходимо описать предикат списка, например: num ([1,5,7,62,19,35,41]).

Введение списков в программу необходимо отразить в трех ее разделах. Домен списка должен быть описан в разделе domains, работающий со списком предикат — в разделе predicates и, нако- нец, надо задать сам список в разделе clauses или goal (листинги 4.1 и 4.2).

Листинг 4.1

Пример программы, работающей со списками

domains bird_list = bird_name * bird_name = symbol number_list = integer * predicates birds(bird_list) score(number_list) clauses birds(["sparrow", "robin", "mockingbird", "thunderbird"]). score([56,87,63,89,91,62,85]).

Page 33: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

33

Отличительной особенностью описания списка является нали- чие звездочки (*) после имени домена элементов. Так, запись bird_name * следует понимать как список, состоящий из элементов домена bird_name (рис. 4.1).

Листинг 4.2

Примеры внешних целей

birds([В,_,_,_]). birds([В1,В2,_,_]). score([F,S,T,_,_,_,_]). birds(All). score(All).

Рис. 4.1. Пример программы, работающей со списками

При задании целей в первых трех примерах в листинге 4.2 тре- бовалось точное знание пользователем количества элементов спи- ска, что не всегда возможно. Однако Prolog позволяет отделять от списка первый элемент и обрабатывать его отдельно. Данный ме- тод работает вне зависимости от длины списка до тех пор, пока

Page 34: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

34

список не будет исчерпан. Этот метод доступа к голове списка на- зывается методом разделения списка на голову и хвост.

Операция деления списка на голову и хвост обозначается при помощи вертикальной черты (|): [Head|Tail]. Head здесь является переменной для обозначения головы списка, переменная Tail обо- значает хвост списка (листинг 4.3).

Листинг 4.3

Пример рекурсивного правила печати элементов списка

print_list([]):-!. print_list([Head|Tail]):- write(Head),nl, print_list(Tail).

Когда это правило пытается удовлетворить цель, например, print_list([1,2,3,4]), то первый вариант правила (первая ветвь раз- ветвления правила) — print_list[] — дает неуспех, так как его объект является пустым списком. Напротив, введенный список соответствует объекту второго варианта предиката (вторая ветвь правила) — print_list([Head|Tail]), поэтому это правило срабаты- вает.

Переменной Head, следовательно, присваивается значение пер- вого элемента в списке: 1, в то время как переменной Tail ставится в соответствие оставшаяся часть списка: [2,3,4]. Теперь, когда вы- делен первый элемент списка, с ним можно обращаться так же, как и с любым простым объектом: write(Head), nl. Далее, так как хвост списка есть список сам по себе, то значение переменной Tail мо- жет быть использовано в качестве объекта рекурсивного вызова print_list: print_list(Tail). Когда испытывается данное подправило, Tail имеет значение [2,3,4]. Снова первый вариант правила (print_list[]) не проходит, и соответствие устанавливается при по- мощи второго. Переменной Head присваивается значение 2, кото- рое затем печатается на экране, а процесс повторяется со списком [3,4]. В итоге, когда переменная Head принимает значение 4, пере- менной Tail присваивается пустой список. Теперь при рекурсив- ном вызове print_list(Tail) значение Tail соответствует объекту правила print_list([]). Поскольку этот вариант не имеет рекурсив-

Page 35: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

35

ных вызовов, цель считается удовлетворенной, и вырабатывается условие окончания рекурсии print_list. Тем самым первый вариант позволяет print_list завершиться успехом, когда рекурсивные вы- зовы опустошат весь список.

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

Листинг 4.4

Пример программы с рекурсивным правилом печати элементов списка

domains bird_list = symbol * predicates birds(bird_list) print_list(bird_list) clauses birds(["sparrow", "robin", "mockingbird", "thunderbird"]). print_list ([]):-!. print_list ([Head|Tail]):- write (Head),nl, print_list (Tail). goal birds(X), print_list(X).

Операции над списками Поиск элемента в списке представляет собой просмотр

списка для выявления соответствия между элементом данных и элементом просматриваемого списка. Если такое соответствие найдено, то поиск заканчивается успехом; в противном случае поиск заканчивается неуспехом. Для сопоставления объекта по- иска с элементами просматриваемого списка необходим преди- кат, объектами которого являются эти объект поиска и список:

find_it(3, [1,2,3,4,5]).

Page 36: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

36

Рис. 4.2. Пример программы с рекурсивным правилом печати элементов списка

Первый из объектов утверждения — 3 — есть объект поиска. Второй — это список [1,2,3,4,5]. Для выделения элемента из спи- ска и его сравнения с объектом поиска можно применить метод разделения списка на голову и хвост. Стратегия поиска при этом будет состоять в рекурсивном выделении головы списка и сравне- нии ее с искомым элементом.

Правило поиска может сравнивать объект поиска и голову те- кущего списка. Саму операцию сравнения можно записать в виде: find_it(Head,[Head|_]). Этот вариант правила предполагает наличие соответствия между искомым элементом и головой списка. В дан- ном случае нет необходимости заботиться о том, что происходит с хвостом. Если искомый элемент и голова списка действительно соответствуют друг другу, то результатом сравнения явится успех; если же нет, то неуспех. Но если эти два элемента данных различ- ны, то попытка сопоставления считается неуспешной, происходит откат и поиск другого правила или факта, с которыми можно снова попытаться найти соответствие. Для случая несовпадения искомо- го элемента и головы списка необходимо предусмотреть правило,

Page 37: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

37

которое выделяло бы из списка следующий по порядку элемент и делало бы его доступным для сравнения: find_it(Head, [_|Tail]): -find_it(Head, Tail).

Если правило find_it(Head, [Head|_]) неуспешно, то происходит откат и делается попытка со вторым вариантом. При этом опять присвоенный переменной Tail список разделяется на голову и хвост, и процесс повторяется, пока данное утверждение не даст либо успех (в случае установления соответствия на очередной ре- курсии), либо неуспех (в случае исчерпания списка) (листинг 4.5 и рис. 4.3).

Листинг 4.5

Пример программы поиска элемента в списке

domains bird_list = symbol * predicates birds(bird_list). find_it(symbol,bird_list). clauses birds(["sparrow", "robin", "mockingbird", "thunderbird"]). find_it(Head, [Head|_]):- write("I found it!"), !. find_it(Head, [_|Tail]):- find_it(Head, Tail). goal birds(X), find_it("robin",X).

Присоединение списка Слияние двух списков и получение таким образом третьего

списка принадлежит к числу наиболее полезных при работе со списками операций (листинг 4.7 и рис. 4.4).

В качестве примера рассмотрим две переменные L1 и L2, представляющие списки и имеющие значения [1,2,3] и [4,5] соответственно. Тогда весь процесс слияния можно представить в виде такой совокупности действий: • список L3 (результирующий) вначале пуст; • элементы списка L2 пересылаются в L3; теперь значением L3

будет [4,5];

Page 38: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

38

Рис. 4.3. Пример программы поиска элемента в списке

• элементы списка L1 пересылаются в L3; в результате он при- нимает значение [1,2,3,4,5]. Структура правила для выполнения этих действий приведена

ниже (листинг 4.6).

Листинг 4.6

Правила для выполнения слияния двух списков

append([],L,L):-!. append([N|LI],L2,[N|L3]):- append(LI,L2,L3).

Если на его вход подать списки L1= [1,2,3] и L2= [4, 5], то сна-

чала Prolog пытается удовлетворить первый вариант правила: append([],L,L) . Чтобы сделать это, первый объект предиката должен быть пус-

тым списком. Однако это не так. Внутренний процесс унификации Prolog, пытаясь удовлетворить второе правило append, раскручи- вает цепочку рекурсий до тех пор, пока не обнулит первый список. Элементы списка при этом последовательно пересылаются в стек.

Page 39: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

39

Когда первый объект предиката append окажется пустым спи- ском, становится возможным применение первого варианта прави- ла. Третий список при этом инициализируется вторым:

append([], [4,5], [4,5]). Теперь Prolog начинает сворачивать рекурсивные вызовы вто-

рого правила. Извлекаемые при этом из стека элементы помеща- ются один за другим в качестве головы к первому и третьему спискам. Следует особо отметить, что элементы извлекаются в обратном порядке (ведь это стек!) и что значение извлеченного из стека элемента присваивается переменной N одновременно в [N|L1] и [N|L3].

Шаги данного процесса можно представить так: append([], [4,5], [4,5]) append([3], [4,5], [3,4,5]) append([2,3], [4,5], [2,3,4,5]) append([1,2,3], [4,5], [1,2,3,4,5])

Листинг 4.7

Пример программы слияния двух списков

domains type=integer list=type* predicates append(list,list,list) clauses append([],L,L):-!. append([H|T],P,[H|Y]):-append(T,P,Y). goal append([1,2,3],[4,5],X), write(X).

Определение количества элементов в списке Чтобы найти длину непустого списка, можно воспользоваться

рекурсией (листинг 4.8 и рис. 4.5).

Page 40: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

40

Рис. 4.4. Пример программы слияния двух списков

Листинг 4.8

Пример программы определения длины списка

domains list = integer* predicates length(list, integer) clauses length([], 0):-!. length([_|T], N) :- length(T, N1), N = N1 + 1. goal length ([2, 12, 45], X), write(X).

Page 41: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

41

Рис. 4.5. Пример программы определения длины списка

Считывание списка В листинге 4.9 представлен код программы считывания целых

чисел с терминала и занесения их в список (рис. 4.6)

Листинг 4.9

Пример программы считывания списка

domains list = integer* predicates readlist(list) clauses readlist([H|T]) :- readint(H), !, readlist(T). readlist([]). goal readlist(TheList), write("\n The list is: ", TheList, "\n").

Page 42: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

42

Рис. 4.6. Результат программы «Считывание целых чисел с терминала и занесение их в список»

Преобразование строки в список символов или в список атомов

В листинге 4.10 представлен код программы преобразования строки в список символов (рис. 4.7). В листинге 4.11 представ- лен код программы преобразования строки в список атомов (рис. 4.8).

Листинг 4.10

Пример программы преобразования строки в список символов

domains charlist = char* predicates name(string, charlist) clauses name("", []). name(S, [H|T]) :- frontchar(S, H, S1), name(S1, T). goal name("Prolog", List), write(List).

Page 43: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

43

Рис. 4.7. Результат программы «Преобразование строки в список символов»

Листинг 4.11

Пример программы преобразования строки в список атомов

domains namelist = name* name = symbol predicates string_namelist(string, namelist) clauses string_namelist(S, [H|T]) :- fronttoken(S, H, S1), !,

string_namelist(S1,T). string_namelist(_, []). goal string_namelist("Prolog is the best language", List),

write(List).

Задание

1. Написать в Turbo Prolog программу, аналогичную приве-денной в листинге 4.5 (поиск элемента в списке), но для других предикатов.

Page 44: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

44

Рис. 4.8. Результат программы «Преобразование строки в список атомов»

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

3. Написать программу считывания целых чисел с терминала и занесение их в список.

4. Написать программу преобразования строки в список сим-волов.

5. Написать программу преобразование строки в список ато-мов.

Контрольные вопросы

1. Что такое списки в языке Prolog? 2. Из каких частей состоит список в языке Prolog? 3. В чем заключается метод разделения списка на голову и

хвост? 4. Как работает алгоритм поиска элемента в списке? 5. Как работает алгоритм слияния двух списков? 6. Как работает алгоритм определения длины списка?

Page 45: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

45

Лабораторная работа № 5. Работа с файловой системой

Продолжительность выполнения лабораторной работы: 2 ак. часа. Целью лабораторной работы является знакомство со стандарт-

ными предикатами для работы с файлами в языке Prolog.

Теоретическая часть

Пролог использует current_readdevice (текущее устройство чтения), с которого считывается ввод, и current_write_device (те- кущее устройство записи), на которое посылается вывод. Как пра- вило, текущим устройством чтения является клавиатура, а теку- щим устройством записи — экран дисплея. Однако вы можете назначить другие устройства. Например, ввод может читаться из файла, хранимого во внешней памяти (возможно, на диске). Мож- но переопределить устройства текущего ввода и вывода во время исполнения программы.

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

Файл, открытый для любого действия, отличного от чтения, должен быть закрыт после завершения операции. В противном случае внесенные в файл изменения могут быть потеряны. Можно открыть несколько файлов одновременно. При этом ввод вывод могут быть быстро переназначены между открытыми файлами. Открытие и закрытие файлов занимает намного больше времени, чем переназначение потоков данных между ними.

Когда Пролог открывает файл, он связывает символическое имя с действительным именем файла операционной системы и ис-

Page 46: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

46

пользует это символическое имя для направления ввода и вывода. Символические имена файлов должны начинаться с маленькой бу- квы и должны быть объявлены в описании домена file.

Предикат openread открывает файл OSFileName дли чтения, используя формат: openread(SymbolicFileName,OSFileName).

Пролог обращается к открытому файлу по символическому имени SymbolicFileName, объявленному в домене file. Если файл не может быть открыт, Пролог выдаст сообщение об ошибке.

Предикат openwrite открывает файл OSFileName для записи, используя формат: openwrite(SymbolicFileName,OSFileName).

Если файл уже существует, то он уничтожается. В противном случае Пролог создает новый файл и помещает его в соответст- вующем каталоге. Если файл не может быть создан, Пролог вы- даст сообщение об ошибке.

Предикат openappend открывает файл OSFileName для записи в конец файла. При этом используется формат: openappend(Symbolic FileName,OSFileName).

Предикат openmodify открывает файл OSFileName и для запи- си, и для чтения; если файл уже существует, он не будет перезапи- сан, openmodify имеет формат: openmodify(SymbolicFileName, OS- FileName).

При открытии файла в текстовом режиме предикат filemode устанавливает указанный файл в текстовый или двоичный режим, используя формат: filemode(SymbolicFileName,FileMode).

Если FileMode=0, файл SymbolicFileName устанавливается в двоичный режим; если FileMode=1, то он устанавливается в тек- стовый режим. В текстовом режиме при записи к новым строкам добавляются символы «возврат каретки» (ASCII 13)\ «перевод строки» (ASCII 10), а при чтении эта пара символов интерпретиру- ется как новая строка.

В двоичном режиме никаких преобразований не производит- ся. Для чтения двоичного файла вы можете использовать только предикат readchar или предикаты для доступа к двоичным фай- лам.

Предикат closefile закрывает указанный файл; он использует формат: closefile(SymbollcFileName).

Page 47: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

47

Предикат readdevice переопределяет current_read_device (теку- щее устройство чтения) или возвращает его имя. Предикат имеет формат: readdevice(SymbolicFileName).

Предикат readdevice переопределяет текущее устройство чте- ния, если переменная SymbolicFileName определена, и файл от- крыт для чтения. Если SymbolicFileName является свободной переменной, то readdevice присвоит ей имя текущего активного устройства чтения.

Предикат writedevice либо назначает, либо позволяет получить имя current_write_device (текущего устройства записи). Он имеет формат: writedevice(SymbolicFileName).

Предикат writedevice переопределит устройство записи, если указанный файл открыт для записи или добавления. Если пере- менная SymbolicFileName свободна, writedevice присвоит ей имя текущего активного устройства записи.

Рассмотрим пример записи символов в файл «myfile.txt», кото- рый создается на диске (листинг 5.1 и рис. 5.1, 5.2). В данном при- мере после запуска программы символы, вводимые с клавиатуры, будут записываться в файл, пока не встретиться символ «#».

Листинг 5.1

Пример программы записи символов в файл

domains file = myfile predicates read_in_loop clauses read_in_loop :- readchar(X), X<>'#', !, write(X),

read_in_loop. goal openwrite(myfile,"D:\\Prolog\\myfile.txt"), writedevice(myfile), not(read_in_loop), closefile(myfile), writ-

edevice(screen), write("Zapis v fail 'myfile.txt' uspechno proizvedena. \n ").

Page 48: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

48

Рис. 5.1. Результат работы программы «Запись символов в файл «myfile.txt»

Рис. 5.2. Файл «myfile.txt»

Пример программы чтения символа из файла и вывода его на экран представлен в листинге 5.2 (рис. 5.3, 5.4).

Листинг 5.2

Пример программы чтения символа из файла

domains file = infile predicates position clauses position :- readdevice(keyboard), nl, write("Vvedite nomer

pozicii: "), readreal(X), readdevice(infile), filepos(infile, X, 0),

Page 49: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

49

Окончание листинга 5.2

readchar(Y), write("Zdes zapisan simvol: ",Y), position. goal write("S kakim failom vi hotite rabotat? \n"), readln(Fname), openread(infile, Fname), position.

Рис. 5.3. Результат программы «Чтение символа из файла и вывод его на экран»

Рис. 5.4. Файл «input.txt»

Задание

1. Реализовать запись символов в файл «myfile.txt», который создается на текущем диске.

2. Реализовать чтение символа из файла и вывод его на экран дисплея.

Page 50: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

50

Контрольные вопросы

1. Какие предикаты предназначены для открытия файла в Prolog?

2. Какой предикат закрывает открытый файл? 3. Для чего служит предикат filemode? 4. Для чего служит предикат readdevice? 5. Для чего служит предикат writedevice?

Page 51: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

51

Лабораторная работа № 6. Создание динамических баз данных

Продолжительность выполнения лабораторной работы: 4 ак. часа. Целью лабораторной работы является знакомство с методами

создания динамических баз данных в языке Prolog.

Теоретическая часть

Базы данных на Prolog В Prolog имеются специальные средства для организации баз

данных, которые рассчитаны на работу с реляционными базами данных. Внутренние унификационные процедуры языка Prolog осуществляют автоматическую выборку фактов с нужными значе- ниями известных параметров и присваивают значения еще не оп- ределенным. Механизм отката позволяет находить все имеющиеся ответы на сделанный запрос.

Описание предикатов динамической базы данных выполняется в разделе database. Все различные утверждения этого предиката составляют динамическую базу данных Prolog. Она называется динамической, поскольку во время работы программы из нее мож- но удалять любые содержащиеся в ней утверждения, а также до- бавлять новые. В этом состоит ее отличие от «статических» баз данных, где утверждения являются частью кода программы и не могут быть изменены во время ее работы. Другая важная особен- ность динамической базы данных состоит в том, что она может быть записана на диск, а позже считана с диска в оперативную па- мять. Важным является и то, что в динамической базе данных мо- гут содержаться только факты (но не правила).

Иногда бывает предпочтительно хранить часть информации базы данных в виде утверждений статической базы данных; тогда эти дан- ные заносятся в динамическую базу данных сразу после активизации

Page 52: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

52

программы. Для этой цели используются специальные предикаты. В целом предикаты статической базы данных имеют другое имя, но ту же самую форму представления данных, что и предикаты динами- ческой базы. Например, предикат статической базы данных, соответ- ствующий предикату dplayer(name,team,position) для динамической базы данных, может быть описан так: player(name,team,position).

Предикаты динамической базы данных в языке Prolog В Prolog имеются встроенные предикаты для работы с динами-

ческой базой данных. Предикат asserta вставляет новый факт в ба- зу данных фактов перед имеющимися фактами для данного преди- ката, a assertz — после имеющихся фактов данного предиката. Использование предиката assert дает результат, аналогичный ис- пользованию assertz. Предикат retract удаляет утверждение из ди- намической базы данных. Так же, как asserta и assertz, предикат retract применим только в отношении фактов.

Объявление динамической базы данных, в которую факты мо- гут добавляться во время выполнения программы или выбираться из файла посредством предиката consult, осуществляется посред- ством ключевого слова database.

Примеры работы с базой данных приведены в листингах 6.1–6.5 (рис 6.1–6.6).

Листинг 6.1

Пример программы создание и сохранения базы данных

domains tip, fun = symbol x, kol = integer database ms(tip,fun,x,kol) clauses ms(k155la3,i_ne,2,4). ms(k155la4,i_ne,3,3).

ms(k155la1,i_ne,4,2). ms(k155ln1,ne,1,6). ms(k155le1,ili,2,4). ms(k155li3,i,3,3). goal save (ms).

Page 53: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

53

Рис. 6.1. Созданная база дынных «ms»

Листинг 6.2

Пример программы с простейшим итерационным процессом

database counter(integer) predicates repeat count clauses repeat. repeat :- repeat. count :- assert(counter(0)),fail. count :- repeat, counter(X), Y=X+1, retract(counter(X)), as-

serta(counter(Y)), write(Y,"\n"), Y=100. goal count.

Рис. 6.2. Результат работы программы «Простейший итерационный процесс»

Page 54: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

54

Листинг 6.3

Пример программы считывания базы данных из файла

domains i = integer database record(i,i,i) goal consult("tabl.dba"), record(X,Y,Z), write(X,"*",Y,"=",Z), nl, fail.

Рис. 6.3. Результат работы программы «Считывание БД из файла»

Рис. 6.4. Файл «tabl.dba»

Page 55: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

55

Листинг 6.4

Пример программы базы данных о читателях

domains i=integer database reader(symbol,i,i) counter(i) predicates wr(i,i). repeat. inbase. count(i,i). clauses repeat. repeat :- repeat. count(X,Y) :- counter(X),Y=X+1, retract(counter(X)), as-

sert(counter(Y)). inbase :- repeat, write('&'), readln(Name), readint(Ticket), readint(Date), assert(reader(Name,Ticket,Date)), count(_,Y),Y=5. wr(D,Y) :- retract(reader(_,_,D)), count(Y,Y1), wr(D,Y1). wr(_,Y) :- counter(Y), write("Count=",Y),!. goal assert(counter(0)), inbase, save("reader.dba"), asserta(counter(0)), wr(10,Y).

Page 56: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

56

Рис. 6.5. Результат программы «База данных о читателях»

Рис. 6.6. База данных «reader.dba» о читателях

Листинг 6.5

Пример программы работы с базой данных

database dplayer (symbol, symbol, integer) predicates player (symbol, symbol, integer) download_base rule menu (integer)

Page 57: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

57

Продолжение листинга 6.5

search (symbol) clauses player("Marino","M.D.",13). player("Dent","C.B.",95). player("Kosar","C.B.",19). player("Cosbie","D.C.",84). player("Malone","P.S.",16). rule:- write("1. Add data to DB"), nl, write("2. Remove data"), nl, write("3. Find data about players from team"), nl, write("4. Show DB"), nl, write("5. Exit"), nl, readint(N), N<5, menu(N). menu (1):- write ("Input name, team name and player num-

ber."),nl, write("Name: "), readln(Name), write("Team name: "), readln(Team), write("Player number: "), readint(Number), assertz(dplayer(Name,Team,Number)). menu(2):- write("Input name of player for deleting data:"),nl, readln (Name), retract(dplayer(Name,_,_)). menu(2):- write("There is no player with such name!"),nl. menu(3):- write("Input team name: "),nl, readln (Team), write("Players from this team: "),nl, search(Team).

Page 58: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

58

Окончание листинга 6.5

menu(4):- dplayer(F,T,N), write("Name: ",F),write(". Team: ",T), write(". Number: ", N), nl, fail. search(Team):- dplayer(X,Team,_), write(X), nl, fail. download_base:- player (X, Y, Z), assertz(dplayer(X,Y,Z)), fail. download_base:- write("Dynamic base created. Press ENTER"),

nl, readln(_). Goal download_base, rule.

Задание

1. Реализовать создание и сохранение базы данных. 2. Реализовать простейший итерационный процесс. 3. Реализовать считывание базы данных из файла. 4. Реализовать базу данных о читателях. 5. Создать базу данных о студентах вашей группы: фамилия,

имя, год рождения. Получить список студентов старше 20 лет.

Контрольные вопросы

1. В каком разделе программы на языке Prolog определяются предикаты динамической базы данных?

2. Чем отличается статическая база данных от динамической в языке Prolog?

3. Для чего служит встроенный предикат asserta? 4. Для чего служит встроенный предикат assertz? 5. Для чего служит встроенный предикат retract?

Page 59: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

59

Лабораторная работа № 7. Создание экспертных систем

Продолжительность выполнения лабораторной работы: 2 ак. часа.

Целью лабораторной работы является знакомство с методами создания экспертных систем в языке Prolog.

Теоретическая часть

Структура экспертной системы Чтобы выполнять работу эксперта, компьютерная программа

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

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

Экспертная система, базирующаяся на правилах (на языке Prolog) содержит множество правил, которые вызываются посред- ством входных данных в момент сопоставления. Такая экспертная система также содержит интерпретатор в механизме вывода, кото- рый выбирает и активизирует различные модули системы. Работу этого интерпретатора можно описать как последовательность трех шагов:

1) интерпретатор сопоставляет образец правила с элементами данных в базе знаний;

Page 60: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

60

2) если можно вызвать более одного правила, то интерпретатор использует механизм разрешения конфликта для выбора правила;

3) интерпретатор применяет выбранное правило, чтобы найти ответ на заданный вопрос.

Этот процесс интерпретации является циклическим и называ- ется циклом «распознавание — действие». В системе, базирую- щейся на правилах, количество продукционных правил определяет размер базы знаний. Некоторые наиболее сложные системы имеют базы знаний из более 5000 продукционных правил.

Для примера рассмотрим экспертную систему для идентифи- кации породы собак, которая должна помочь потенциальному хозяину выбрать породу собаки в соответствии с определенными критериями (листинг 7.1). Предположим, что пользователь сооб- щил множество характеристик собаки в ответ на вопросы эксперт- ной системы. Интерпретатор работает в цикле «распознавание — действие». Если введенные характеристики сопоставимы с харак- теристиками какой-либо породы собаки, составляющими часть базы знаний, то вызывается соответствующее продукционное пра- вило, и в результате идентифицируется порода, а затем результат сообщается пользователю (рис. 7.1). Если порода не идентифици- рована, то это тоже сообщается пользователю (рис. 7.2).

Листинг 7.1

Пример экспертной системы

database dpos(symbol) dneg(symbol) predicates do_expert do_consult dog_is(symbol) clear_facts prop (symbol) clauses

Page 61: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

61

do_expert:- write("Отвечайте на вопросы, выбирая характери-стики собаки (y/n)."),nl, do_consult.

do_consult:- dog_is(X),!,write("Вам подойдет собака породы",X,"!"),nl, readln(_),clear_facts.

do_consult:- write("Извините, но мы не можем Вам по-мочь."),nl, readln(_),clear_facts.

prop(X):- dpos(X),!. prop(X):- not(dneg(X)), write ("Устраивает ли Вас характеристика: ",X,"?"),nl,

readln(A), A="y", asserta(dpos(X)). prop(X):- asserta(dneg(X)), fail. clear_facts:- retract (dpos (_)), fail. clear_facts:- retract (dneg (_)), fail. dog_is ("английский бульдог"):- prop ("короткая шерсть"), prop ("рост 55 см"), prop ("низко посажен хвост"), prop ("хороший характер"). dog_is ("гончая"):- prop ("короткая шерсть"), prop ("рост 55 см"), prop ("длинные уши"), prop ("хороший характер"). dog_is ("дог"):- prop ("короткая шерсть"), prop ("низко посажен хвост"), prop ("хороший характер"), prop ("вес 45 кг"). dog_is ("коккер-спаниель"):- prop ("длинная шерсть"),

Page 62: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

62

prop ("рост 55 см"), prop ("низко посажен хвост"), prop ("длинные уши"), prop ("хороший характер"). dog_is ("ирландский сеттер"):- prop ("длинная шерсть"), prop ("рост 75 см"), prop ("длинные уши"). dog_is ("сенбернар"):- prop ("длинная шерсть"), prop ("низко посажен хвост"), prop ("хороший характер"), prop ("вес 45 кг"). goal do_expert.

Рис. 7.1. Пример работы экспертной системы (поиск завершился удачей)

Page 63: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

63

Рис. 7.2. Пример работы экспертной системы (поиск завершился неудачей)

Задание

Написать в Turbo Prolog аналогичную программу для произ- вольной экспертной системы.

Контрольные вопросы

1. Что такое экспертная система? 2. Из каких частей состоит экспертная система? 3. Как работает интерпретатор в механизме вывода в Turbo

Prolog?

Page 64: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

64

Лабораторная работа № 8. Решение логических задач

Продолжительность выполнения лабораторной работы: 4 ак. часа.

Целью лабораторной работы является знакомство с методами решения логических задач в языке Prolog.

Теоретическая часть

Язык Prolog хорошо подходит для решения логических задач. Рассмотрим его возможности на примере (листинг 8.1 и рис. 8.1).

По условию задачи беседует трое друзей: Белокуров, Рыжов, Чернов. Брюнет сказал Белокурову: «Любопытно, что один из нас блондин, другой брюнет, третий рыжий, но ни у кого цвет волос не соответствует фамилии». Необходимо определить, какого цвета волосы у каждого из друзей.

Для решения построим вспомогательную табл. 8.1. В ней ука- заны фамилии друзей и их возможные цвета волос. Из условия очевидно, что Белокуров не брюнет и не блондин, Чернов не чер- ный, а Рыжов не рыжий. Эти данные отображены в табл. 8.1. Таким образом, методом исключения можно узнать цвет волос кА- ждого из друзей.

Таблица 8.1

Вспомогательная таблица для решения логической задачи

Белокуров Чернов Рыжов

Блондин Нет Рыжий Нет Брюнет Нет Нет

Page 65: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

65

В качестве правил в программе на языке Prolog необходимо отразить, что:

1. Белокуров не брюнет и не блондин; 2. Чернов не брюнет, цвета волос Чернова и Белокурова не

совпадают; 3. Рыжов не рыжий, цвет волос у Рыжова и Белокурова,

Рыжова и Чернова не совпадают.

Листинг 8.1

Пример программы решения логической задачи

predicates surname(symbol) color(symbol) corresponds(symbol, symbol) answer clauses surname("Белокуров"). surname("Рыжов"). surname("Чернов"). color("рыжий"). color("брюнет"). color("блондин"). corresponds(X,Y):- surname(X), color(Y), X="Белокуров", not(Y="брюнет"), not(Y="блондин"). corresponds(X,Y):- surname(X), color(Y), X="Чернов", not(Y="брюнет"), not(corresponds("Белокуров",Y)). corresponds(X,Y):- surname(X), color(Y), X="Рыжов", not(corresponds("Белокуров", Y)), not(corresponds("Чернов",

Y)). answer:- corresponds(X,Y), write(X," — ", Y),nl, fail. goal clearwindow, answer.

Page 66: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

66

Рис. 8.1. Результат решения логической задачи

В листинге 8.2 приведен пример решения задачи о ханойской башне (упрощенный вариант).

Листинг 8.2

Пример решения задачи о ханойской башне

domains loc = right; middle; left predicates hanoi(integer) move(integer,loc,loc,loc) inform(loc,loc) goal hanoi(5). clauses hanoi(N) :- move(N, left, middle, right). move(1, A, _, C) :- inform(A, C), !. move(N, A, B, C) :- N1 = N — 1, move(N1, A, C, B), in-

form(A, C),

Page 67: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

67

Окончание листинга 8.2

move(N1, B, A, C). inform(Loc1, Loc2) :- nl, write("Disk pereveden s ", Loc1,

" na ", Loc2).

Задание

1. Написать программу для решения следующей логической задачи: «В соревнованиях по бегу Юра, Гриша и Толя заняли три первых места. Какое место занял каждый из них, если Гриша занял не второе и не третье место, а Толя не третье?»

2. Написать программу для решения следующей логической задачи: «Три подруги вышли в белом, зеленом и синем платьях и туфлях. Известно, что только у Ани цвета платья и туфлей совпадали. Ни туфли, ни платье Вали не были белыми. Наташа была в зеленых туфлях. Определить цвета платья и туфель на каждой из подруг».

3. Реализовать программу решения задачи манипулирования кубиками методом поиска в глубину.

4. Реализовать программу решения задачи манипулирования кубиками методом поиска в ширину.

5. Реализовать программу решения задачи о ханойской башне (упрощенный вариант).

Контрольные вопросы

1. Для решения каких задач используется язык Prolog? 2. К какому типу языков программирования относится

Prolog? 3. На основе какого математического языка создан Prolog?

Page 68: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

68

Библиографический список

Болотова Л.С. Системы искусственного интеллекта: модели и технологии, основанные на знаниях / Л.С. Болотова. — М. : Фи- нансы и статистика, 2012.

Боровская Е.В. Основы искусственного интеллекта / Е.В. Боров- ская, Н.А. Давыдова. — М. : БИНОМ. Лаборатория знаний, 2010.

Советов Б.Я. Представление знаний в информационных сис- темах / Б.Я. Советов. — М. : ИД «Академия», 2012.

Чулюков В.А. Системы искусственного интеллекта. Практиче- ский курс / В.А. Чулюков, И.Ф. Астахова [и др.]. — М. : БИНОМ. Лаборатория знаний, 2012.

Язык программирования Prolog. Основы логического програм- мирования. [Электронный ресурс]. URL:

http://it.kgsu.ru/Prolog/oglav.html. (Дата обращения: 20.06.2014).

Page 69: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

69

Учебное издание

Системы

искусственного интеллекта

Лабораторный практикум

для студентов, обучающихся по направлениям: 230100.62 — Информатика и вычислительная техника

Попов Дмитрий Иванович Лазарева Ольга Юрьевна

Редактор Н.В. Герценштейн

Компьютерная верстка Е.А. Бариновой

Page 70: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

70

Подписано в печать 10.11.14. Формат 60×84/16. Бумага офсетная. Печать на ризографе. Усл. печ. л. 4,07. Тираж 50 экз. Заказ № 37.

Московский государственный университет печати имени Ивана Федорова. 127550, Москва, ул. Прянишникова, д. 2А.

Отпечатано в Издательстве МГУП имени Ивана Федорова.

Page 71: Системы искусственного ...storage.elib.mgup.ru/6/Popov_Lazareva_lab_pr_14.pdf · 2 УДК 004.8 ББК 65.422.5 П 58 Попов Д.И., Лазарева О.Ю

71

Д.И. Попов, О.Ю. Лазарева

Системы искусственного интеллекта

Лабораторный практикум

для студентов, обучающихся по направлениям: 09.03.01 (230100.62) — Информатика

и вычислительная техника

Москва 2014

Московский государственный университет печати имени Ивана Федорова