Н.Новгород: НГПУ им. К.Минина, 2014.

advertisement
Министерство образования и науки Российской Федерации
ФГБОУ ВПО «Нижегородский государственный педагогический университет
имени Козьмы Минина»
М.А.Иорданский
ПОСТРОЕНИЕ УЧЕБНЫХ БАЗ
ЗНАНИЙ НА ПРОЛОГЕ
Учебно-методическое
пособие
Н.Новгород
2014г.
УДК 681.3 (07)
ББК 32.81р3
И756
Иорданский М.А.
И756 Построение учебных баз знаний на Прологе: учебно-методическое
пособие / М.А. Иорданский.  НГПУ им. К.Минина, 2014.  43с.
В пособии приводятся основные понятия логического программирования. Рассматривается программирование в средах Пролог-Д и Турбо-Пролог. Содержатся примера построения различных учебных баз знаний, задания для самостоятельной работы и советы по
их выполнению.
Пособие составлено на основе лекций и лабораторных занятий по основам искусственного интеллекта, проводившихся автором в течении ряда лет со студентами факультетов МИФ и ЕМ и КН, изучающими информатику. Материал пособия может быть полезным
учителям информатики и школьникам, интересующимся проблемами искусственного интеллекта
УДК 681.3 (07)
ББК 32.81р3
 Иорданский М.А., 2014
 НГПУ им. К.Минина, 2014
2
Содержание
I. Основные понятия Пролога ______________________________ 4
1. Логические основы _________________________________________________________ 4
2. Семантические модели _____________________________________________________ 6
3. Правила логического вывода
_____________________________________________ 6
II. Система логического программирования Пролог-Д _________ 7
1. Синтаксис языка ___________________________________________________________ 7
2. Интерфейс системы
_______________________________________________________ 10
3. Базы знаний «Родственники» ____________________________________________ 12
4. Базы знаний «Вычисления» ______________________________________________ 24
5. Базы знаний «Списки» ____________________________________________________ 27
III. Система логического программирования Турбо Пролог ____ 32
1. Синтаксис языка __________________________________________________________ 32
2. Интерфейс системы
_______________________________________________________ 35
3. Графический режим _______________________________________________________ 38
Литература
___________________________________________________________________ 43
3
I. Основные понятия Пролога
1. Логические основы
Задачи накопления и поиска информации решаются на ЭВМ с использованием баз данных. Поскольку функционирование ЭВМ опирается на законы
логики, то естественно требовать от машины получения логически осмысленных заключений и рекомендаций. Основой для этого является возможность
хранения не только фактической информации, но и правил вывода следствий
из имеющихся фактов. Используя указанные правила, можно устанавливать
новые факты, исходя из имеющихся. Базы данных, содержащие правила вывода, называются базами знаний (БЗ).
Одним из средств организации БЗ являются языки логического программирования, в частности язык Пролог (Программирование логики). Первая
версия Пролога была разработана в в 1971 году в университете г. Марселя
(Франция) группой ученых, занимавшихся исследованиями в области искусственного интеллекта. Вначале Пролог реализовывался на больших ЭВМ
средствами таких языков, как ALGOL и FORTRAN. Позднее в связи с массовым распространением персональных компьютеров появились многочисленные версии этого языка, реализованные средствами Turbo Pascal.
Теоретической основой логического программирования является математическая логика. Пролог относится к непроцедурным языкам, когда не описывается явно, как решать задачу. Компьютер ищет решение сам, используя
некоторый набор логических правил - машину логического вывода. Быстродействие той или иной реализации Пролога оценивается числом элементарных
логических выводов, осуществляемых в единицу времени.
Описание задачи осуществляется в БЗ путем задания соответствующих
объектов предметной области. Объекты имеют имена, за определениями которых следуют описания свойств объектов и отношений между ними. Объекты
могут быть константами, переменными, функциями. Отношения задаются
предикатами – логическими функциями, принимающими два возможных
значения – истина или ложь. Предикаты могут соединяться логическими связ4
ками «И», «ИЛИ», «НЕ», «ЕСЛИ» и др. В формулах логики предикатов 1 порядка используются также кванторы общности и существования. В формулах
Пролога каждая переменная находится в области действия квантора общности.
Такие формулы называются предложениями. В целях экономии записи предложений внешние кванторы общности обычно опускаются.
В русскоязычной системе логического программирования Пролог-Д
предложения могут содержать лишь связки «И» (обозначаемые запятыми) и
одну связку «ЕСЛИ» (символ «: »):
A1 , A2 ,..., Ak :  B1 , B2 ,..., Bn
(1 )
где Ai , i  1, k и B j , j  1, n предикаты. Предложение (1) читается так: « A1 , A2 ,..., Ak
истинны, если истинны B1 , B2 ,..., Bn ». Связки «ИЛИ» реализуются в системе
Пролог-Д путем использования двух правил с одинаковыми левыми частями.
В англоязычной системе Турбо-Пролог связка «ИЛИ» может указываться явно
с помощью союза «or».
Предложения вида (1) называются дизъюнктами, учитывая возможность их записи с использованием лишь связок
дизъюнкции и отрицания:
X 1 & X 2  X 1V X 2 и X1   X 2  X1VX 2 . При этом используются лишь дизъюнкты
Хорна, когда параметр k  0  1:

k  0 и n  0 получаем тождественно ложный пустой дизъюнкт;

k  1 и n  0 предложение (1) принимает вид A1 ; и называется фактом;

k  0 и n  0 предложение (1) называется вопросом, состоящим из n це-
лей. В Прологе-Д перед вопросом явно указывается соответствующий знак:
? B1 , B2 ,..., Bn ;

k  1 и n  0 предложение (1) принимает вид A1 :  B1 , B2 ,..., Bn и называется
правилом; A1 - голова правила; B1 , B2 ,..., Bn - тело правила, состоящее из n
предикатов - условий (подцелей)
Для построения логического следствия, не зависящего от интерпретации,
используется метод резолюций. Суть метода состоит в следующем. Пусть S
некоторое множество дизъюнктов и U – дополнительный дизъюнкт. Необхо5
димо установить, является ли U логическим следствием из множества S. С
этой целью множество S дополняется дизъюнктом
U (отрицанием U). Если
окажется, что множество {S  U } противоречиво (из него выводится пустой
дизъюнкт), то U логически следует из S.
2. Семантические модели
Семантические модели используются для объяснения смысла (семантики) программ. В Прологе для этого используют две модели: декларативную и
процедурную.
1. Декларативная модель определяет, что должно быть результатом работы
программы, какие факты и правила необходимы для решения поставленной
задачи.
2. Процедурная модель определяет, как получается результат, как реально
обрабатываются факты и правила в ходе выполнения программы на Прологе.
Под процедурой понимается множество предложений программы, имеющих в заголовке (голове) одноименные предикаты.
Для решения задачи на Прологе в принципе достаточно владений декларативной семантикой. Для повышения эффективности
работы программы
(сокращения времени работы и (или) объема используемой памяти) необходимо учитывать процедурную семантику. При этом может быть важным порядок, в котором располагаются предложения в БЗ и условия в предложениях.
Решение задачи на Прологе заключается в ответе на вопрос к БЗ. Для
ответа на вопрос система пытается удовлетворить (достичь) список всех его
целей. Достичь цели – значит показать, что она логически следует из фактов и
правил программы. Если вопрос содержит переменные, то система должна
найти и выдать соответствующие их конкретизации. Если хотя бы одна цельнее выводится из БЗ, то система сообщает о неуспехе..
3. Правила логического вывода
1. Цель может унифицироваться с фактом или головой правила путем
конкретизации или сцеплений переменных (в отличие от процедурных языков
6
область действия каждой переменной ограничивается предложением, в котором она используется ).
2. Цели правила (вопроса) удовлетворяются слева – направо.
3. Предложения БЗ просматриваются сверху – вниз.
4. Если некоторая цель не может быть унифицирована ни с одним предложением БЗ, то осуществляется возврат к предыдущей удовлетворенной цели
и делается попытка вывести для неё другое, альтернативное решение.
5. При отсутствии предыдущей удовлетворенной цели или при отсутствии у неё альтернативного решения система сообщает о неуспехе.
Поиск альтернативных решений может осуществляться и при успешном выводе, чтобы получить все возможные решения.
II. Система логического программирования Пролог-Д
1. Синтаксис языка
Воспользуемся системой обозначений Бэкуса-Наура принятой для формального описания синтаксиса языков программирования. В этой системе запись «::=» читается как «по определению» или «это есть», часть синтаксической конструкции, заключенная в фигурные скобки может повторяться произвольное число раз (ноль и более), символ «|» означает «или» и применяется
для разделения возможных альтернатив.
БЗ ::= Предложение;{Предложение;}
Предложение ::= Факт | Правило | Вопрос
Факт ::= Имя(Константа{, Константа});
Имя ::= БукваСимвол{Символ}
Символ ::= Буква | Цифра | _
Буква ::= А|а|Б|б| …|Я| я|A| a |B| b| …|Z|z
Цифра ::= 0|1| …|9
Константа ::= Целое | Имя
Целое ::= - Число | Число
Число ::= Цифра{ Цифра }
7
Правило ::= Предикат :- Цель{,Цель};
Предикат ::= Имя(Аргумент{,Аргумент})
Аргумент ::= Константа | Переменная
Переменная ::= Буква | Символ{Символ}’ | _
Цель ::= Предикат | Встроенный предикат
Встроенный предикат ::= ИСТИНА | ЛОЖЬ | НЕ (цель) | ! |
РАВНО(Аргумент, Аргумент) |
БОЛЬШЕ(Аргумент1, Аргумент2) |
МЕНЬШЕ(Аргумент1, Аргумент2) |
Аргумент1, Аргумент2 ::= Целое | Переменная, конкретизированная целым
СЛОЖЕНИЕ(А1,А2,А3) |(истинно, когда
А1+А2 =А3) | УМНОЖЕНИЕ(А1,А2,А3,А4)
(истинно, когда А1*А2+А3 =А4)
А1, А2,А3,А4 ::= целое | переменная, конкретизированная
целым | неконкретизированная переменная
Вопрос ::= ?Цель{,Цель};
Примеры записей БЗ.
1. Фрагмент БЗ «Родственники».
Используется предикат
мама (<кто>,<чья>)
Предложения на русском языке
Предложения на Прологе –Д
Факты
Факты
Надя – мама Аси.
мама (Надя, Ася);
Даша – мама Нади.
мама (Даша, Надя);
Вопросы
Вопросы
Надя – мама Аси?
?мама (Надя, Ася);
Да
Надя – мама Даши?
?мама (Надя, Даша);
Нет
Кто мама у Аси?
?мама (х, Ася);
8
х=Надя
Чья мама Надя?
?мама (Надя, х);
х=Ася
Кто чьи мамы?
?мама (х, у);
х=Надя
у=Ася
х=Даша
у=Надя
Составной вопрос
Составной вопрос
У мамы Аси, кто мама?
?мама (х, Ася),мама(у,х);
2. БЗ «Журнал».
Для описания фактов используется предикат
оценка (<какая>,<у кого>,<предмет>)
оценка (5, Коля, физика);
оценка (2, Вова, алгебра);
оценка (3, Оля, геометрия);
оценка (5, Саша, история);
?оценка (5, х, история);
х=Саша
?оценка (5, х, _);*)
х=Коля
х=Саша
Узнать, кто как учится, можно с помощью правил. Успевающий ученик не
имеет двоек ни по какому предмету:
успев (х) :  оценка (_, х, _),НЕ (оценка (2, х, _));
Поскольку мы подразумеваем, что успевающий учится в классе и следовательно имеет какие-то оценки по каким-то предметам, то компьютеру необходимо это явно указать: (оценка (_, х, _),)
?успев (х);
*) Символ «_» означает, что соответствующая переменная может конкретизироваться любым возможным значением (анонимная переменная), при этом само значение не выводится.
9
х=Коля
х=Саша
Зная, кто такие успевающие, можно определить хорошистов так:
хор (х) :  успев (х), НЕ(оценка (3, х, _));
?хор (х);
х=Коля
х=Саша
Отличники аналогично определяются через хорошистов:
отл (х) :  хор (х), НЕ(оценка (4, х, _));
?отл (х);
х=Коля
х=Саша
2. Интерфейс системы
Ввод программы на Прологе-Д производится в окно встроенного текстового редактора (рис.1). Можно копировать или переносить выделенные фрагменты программ в буфер и из буфера (меню «Редактор»), записывать в файлы
(меню «Файлы»). Запуск программы на исполнение по клавише F9. Размеры
и положение окна можно изменять (меню «Окна»). Найденные решения а
также сообщения о синтаксических ошибках выводятся в окно результата,
расположенное под окном редактора. В зависимости от вида обрабатываемой
информации результаты можно так выводить (меню «Настройки») на текстовый или графический экраны, на печать и записывать в файл. В каждый момент времени активным может быть только одно окно (двойные рамки окна).
Переключать окна можно с помощью мыши. Активное окно можно распахнуть на весь экран и снова свернуть до исходных размеров (клавиша F5). Любую строку программы можно превратить в неисполняемый комментарий, поставив в её начале символ «%».
10
Пример. На рис.1 в окне редактора находится фрагмент БЗ «Родственники»:
Рис.1
После исполнения программы (F9) в окне результата получаем х=Даша.
Работа машины логического вывода
Рассмотрим процесс получения указанного ответа машиной логического
вывода, учитывая процедурную семантику. Цель, указанную в вопросе, удалось унифицировать с головой правила при этом переменные «х» были сцеплены, а переменной «у» было присвоено значение «Ася». Далее последовательно слева-направо начался процесс удовлетворения целей из тела правила.
Первую из них удалось унифицировать с первым предложением из БЗ. При
этом были выполнены присваивания: х=Надя, п=Ася. Следующую цель из тела правила при этих конкретизациях не удалось удовлетворить. Был выполнен
откат к предыдущей удовлетворенной цели. Для неё было найдено альтернативное решение: х=Даша, п=Надя. Используя это решение, удалось удовлетворить и вторую цель из тела правила при у=Ася. Последнее значение запрашиваемой переменной «х» (х=Даша) машина выдала как результат.
11
3. Базы знаний «Родственники»
Объектами предметной области выступают лица, находящиеся между собой в тех или иных родственных отношениях. Для изучения этих отношений
достаточно сообщить о каждом человеке его пол и имя, а также указать кто
родитель кого. Эту информацию удобно представить в виде ориентированного
графа, вершины которого соответствуют людям, Из родительских вершин
проводятся дуги в вершины, соответствующие их детям. На следующем рисунке приведен фрагмент подобного ориентированного графа:
Михаил
Фаина
Елена
Анатолий
Миша
Николай
Людмила
Клавдия
Сергей
Таня
Рис. 2
Для сокращения объема записей, учитывая синтаксис Пролога-Д, в качестве
предикатов лиц мужского и женского пола выберем
му(<кто>)
и
же(<кто>), родительское отношение зададим предикатом ро(<кто>,<чей>).
Структуру графа (рис.2) задает следующая фактографическая БЗ:
му(Михаил);
му(Николай);
му(Анатолий);
му(Сергей);
му(Миша);
же(Елена);
же(Клавдия);
же(Фаина);
же(Людмила);
же(Таня);
ро(Михаил, Фаина);
ро(Михаил, Анатолий);
ро(Елена, Фаина);
ро(Елена, Анатолий);
ро(Николай, Людмила);
ро(Николай, Сергей);
ро(Клавдия, Людмила);
ро(Клавдия, Сергей);
ро(Анатолий, Миша);
ро(Анатолий, Таня);
ро(Людмила, Миша);
ро(Людмила, Таня);
Для получения других фактов необходимо использовать правила.
1. Кто чей сын? Если «х» сын «у», то в графе родственных отношений можно
выделить подграфы вида: у
х.
Соответствующее правило можно записать так:
сын(х,у) : му(х), ро(у,х);
? сын(х,у);
х=Анатолий
у=Михаил
х=Анатолий
у=Елена
х=Сергей
у=Николай
х=Сергей
у=Клавдия
х=Миша
у=Анатолий
13
х=Миша
у=Людмила
Повторы в ответах объясняются тем, что машина ищет все возможные решения (в данном случае через обоих родителей).
2. Кто дочь у Николая можно узнать из правила:
дочь(х,у) : же(х), ро(у,х);
?дочь(х,Николай);
х=Людмила
Замечание. Чтобы при этом не выдавалась информация о сыновьях. Необходимо превратить предыдущий вопрос в комментарий (ввести в его начало
символ «%»). Для того чтобы не запутаться в ответах машины, всегда оставляйте активным (без начального символа «%») только один вопрос.
3. Кто отец у Тани можно узнать из правила:
от(х,у) :  му(х), ро(х,у);
?от(х,Таня);
х=Анатолий
Для поиска матерей можно использовать правило:
ма(х,у) :  же(х), ро(х,у);
4. Кто чей брат? Если «х» брат «у», то в графе родственных отношений можно выделить подграфы вида:
р
х
у
Соответствующее правило можно записать так:
бр(х,у) :  му(х), ро(р,х), ро(р,у);
Поскольку машина ищет все возможные решения, то необходимо исключить
выдачу тривиальных решений (при формальном подходе каждый мужчина сам
себе брат), указав, что значения переменных «х» и «у» не должны совпадать.
бр(х,у) :  му(х), ро(р,х), ро(р,у), НЕ(РАВНО(х,у));
?бр(х,у);
14
х=Анатолий
у=Фаина
х=Анатолий
у=Фаина
х=Сергей
у=Людмила
х=Сергей
у=Людмила
х=Миша
у=Таня
х=Миша
у=Таня
Повторы в ответах объясняются тем, что машина ищет все возможные решения (в данном случае через обоих родителей).
5. Кто чья сестра? Соответствующее правило отличается от правила, определяющего брата, лишь указанием женского пола вместо мужского:
се(х,у) :  же(х), ро(р,х), ро(р,у), НЕ(РАВНО(х,у));
6. Кто чей дядя? Если «х» дядя «у», то в графе родственных отношений можно выделить подграфы вида:
р
х
у
Удобно использовать ранее полученное решение для предиката «бр»:
дя(х,у) :  бр(х, р), ро(р, у);
?дя(х,у);
х=Сергей
у=Миша
х=Сергей
у=Таня
15
х=Сергей
у=Миша
х=Сергей
у=Таня
Повтор потому, что решения найдены через обоих родителей Сергея.
7. Кто чей племянник? Это сын брата или сестры. Для того чтобы найти всех
племянников потребуется использование двух правил, поскольку для реализации логической связки «ИЛИ» в Прологе-Д используются правила, различающихся лишь правыми частями:
пл(х,у) :  сын(х,р), бр(у,р);
пл(х,у) :  сын(х,р), се(у,р);
? пл(х,у);
х=Миша
у=Сергей
х=Миша
у=Сергей
х=Миша
у=Фаина
х=Миша
у=Фаина
Здесь решения найдены через обоих родителей: сначала Сергея, а потом Фаины.
Можно использовать для поиска племянников правила, зная, кто является для
них дядями и тетями:
пл(х,у) :  му(х),дя(у,х);
пл(х,у) :  му(х),те(у,х);
?пл(х,у);
х=Миша
у=Сергей
х=Миша
16
у=Сергей
х=Миша
у=Фаина
х=Миша
у=Фаина
8. Кто чей двоюродный брат? Это сын дяди или тети. Если «х» двоюродный
брат «у», то в графе родственных отношений можно выделить подграфы вида:
д
у
х
В графе родственных отношений, изображенному на рис.1, нет таких пографов. Необходимо дополнить граф, например, детьми Сергея. Тогда Миша будет им двоюродным братом. Соответствующие правила можно записать так:
двбр(х,у) :  сын(х,д), дя(д,у);
двбр(х,у) :  сын(х,т), те(т,у);
9. Кто чей дедушка? Это отец родителя. В графе родственных отношений
должны быть пути длины два, исходная вершина которых соответствует лицам мужского пола. Соответствующее правило можно записать так:
дед(х,у) :  от(х,р), ро(р,у);
?дед(х,Таня:);
х=Михаил
х=Николай
Правило для нахождения бабушек:
ба(х,у) :  ма(х, р), ро(р,у);
?ба(х,Миша);
х=Елена
х=Клавдия
10. Кто чей внук? Зная дедушек и бабушек, внуков можно найти так:
17
вн(х,у) :  де(у,х);
вн(х,у) :  ба(у,х);
? вн(х, Елена);
х=Миша
х=Таня
11. Кто чей муж? Учитывая информацию, содержащуюся в графе родственных
отношений, если «х» муж «у», то в графе можно выделить подграфы:
х
у
р
«х» это мужчина, у которого с «у» есть общий ребенок «р»:
муж(х,у) :  му(х),ро(х,р), ро(у,р);
? муж(х,Людмила);
м=Анатолий
м=Анатолий
Решения найдены через каждого из двух детей супругов.
Соответственно жену можно определить через мужа так:
жен(х,у) :  муж(у,х);
?жен(х,Николай);
х=Клавдия
х=Клавдия
Решения найдены через каждого из двух детей супругов.
12. Кто чья золовка? Это сестра мужа. Если «х» золовка «у», то в графе можно выделить подграфы:
У
м
х
Соответствующее правило имеет вид:
зо(х,у) :  се(х,м), муж(м,у);
18
?зо(х,Людмила);
х=Фаина
х=Фаина
х=Фаина
х=Фаина
Всего четыре решения: через обоих родителей (при определении сестры) и
каждого из двух детей (при определении мужа).
13. Кто чей свояк? Это брат жены:
св(х,у) :  бр(х,ж),жен(ж,у);
?св(х,Анатолий);
х=Сергей
х=Сергей
х=Сергей
х=Сергей
Четыре решения выдаются по аналогичным причинам.
14. Кто чей тесть? Это отец жены:
тес(х,у) :  от(х,ж), жен(ж,у);
?тес(х, Анатолий);
х=Николай
х=Николай
Два решения через обоих детей.
Правило для определения тёщи:
тещ(х,у) :  ма(х,ж), жен(ж,у);
15. Кто чей свекор? Это отец мужа:
свк(х,у) :  от(х,м), муж(м,у);
?свк(х,Людмила);
х=Михаил
х=Михаил
Два решения через обоих детей.
16. Кто чей зять? Это муж дочери:
19
зя(х,у) :  муж(х,д), дочь(д,у);
?зя(х,у);
х=Анатолий
у=Николай
х=Анатолий
у=Николай
х=Анатолий
у=Клавдия
х=Анатолий
у=Клавдия
По два решения через обоих детей.
Можно использовать для поиска зятей и более короткие правила, зная, кто является их тестями и тёщами:
зя(х,у) :  тес(у,х);
зя(х,у) :  тещ(у,х);
?зя(х,у);
х=Анатолий
у=Николай
х=Анатолий
у=Николай
х=Анатолий
у=Клавдия
х=Анатолий
у=Клавдия
По два решения через обоих детей.
Использование в БЗ правил позволяет сократить число необходимых исходных фактов, однако, большим может стать и число правил. Для сокращения необходимого числа правил можно использовать в БЗ рекурсивные правила, содержащие в теле правила предикат, одноименный с предикатом из головы правила.
20
Так например, если мы хотим узнать всех своих предков, то нам придется
использовать серию правил вида:
пр(х,у) :  ро(х,у); - предки первого уровня (мамы и папы)
пр(х,у) :  ро(х,п), ро(п,у); предки второго уровня (дедушки и бабушки) и т.д.
С помощью рекурсивного правила можно заменить все нерекурсивные правила, определяющие предков второго и выше уровней:
пр(х,у) :  ро(х,у);
пр(х,у) :  ро(х,п), пр(п,у);
?пр(х,Миша);
х=Анатолий
х=Людмила
х=Михаил
х=Елена
х=Николай
х=Клавдия.
Замечание. При использовании рекурсивных правил необходимо быть
осторожными, чтобы исключить зацикливание программы. Для избежания
этого необходимо, чтобы аргументы одноименного предиката, стоящего в теле
правила, были в том или ином смысле проще значений аргументов одноименного предиката, стоящего в голове правила. Так в рекурсивном правиле для
определения предков аргументы «п» и «у» предиката «пр» в теле правила соответствуют вершинам графа родственных отношений, расстояние между которыми на единицу меньше аналогичного расстояния между вершинами, соответствующими аргументам «х» и «у» предиката «пр» в голове правила.
Следующий пример, иллюстрирует возникновение ситуации зацикливания
при использовании рекурсивного правила.
Хотя языки логического программирования создавались, прежде всего, для
обработки нечисловой информации, встроенные арифметические предикаты
позволяют работать и с числами. При этом наиболее эффективны рекурсивные
БЗ, использующие рекурсивные правила.
21
Пример. БЗ «Таблица умножения».
Воспользуемся предикатом:
умн(<1-й сомножитель>,<2-й сомножитель>,<произведение>)
В БЗ достаточно включить лишь те факты, когда второй сомножитель не
меньше первого. Значение произведения для других ситуаций можно найти с
помощью рекурсивного правила, задающего свойство коммутативности операции умножения:
умн(1,х,х); - свойство умножения на 1
умн(2,2,4);
умн(2,3,6);
...
умн(9,9,81);
умн(х,у,п) :  умн(у,х,п);- свойство коммутативности умножения
?умн(2,4,х);
В ответ на этот вопрос будет выдаваться последовательность решений вида
х=8, пока не переполнится память.
Зацикливание произошло потому, что значения аргументов в правой части рекурсивного правила равны значениям аргументов в левой части правила. Для предотвращения зацикливания можно было бы добавить в вопрос предикат отсечения (!): ?умн(2,4,х),!;. Предикат отсечения невидим для машины
логического вывода при движении слева направо. Однако, при попытке движения справа налево при поиске с возвратом работа машины логического вывода прекращается.
Замечание. Указание предиката отсечения в конце вопроса в любых задачах, имеющих единственное решение, сокращает время работы машины логического вывода. В задачах, имеющих несколько решений, при этом будет
выдано только одно (первое) решение.
22
Задания для самостоятельной работы
I. Составьте правила для определения, кто кому является:
1. Племянницей.
2. Тётей.
3. Двоюродной сестрой.
4. Троюродным братом.
5. Деверем.
6. Невесткой.
7. Снохой.
8. Свояченицей.
9. Сватом.
10.Сватьей.
11. Внучатым племянником.
12. Внучатой племянницей.
13. Двоюродным дедушкой.
14. Двоюродной бабушкой.
15. Сводным братом.
16. Сводной сестрой.
17. Мачехой.
18. Отчимом.
19. Пасынком.
20. Падчерицей.
Замечания.
1. Для облегчения работы удобно зарисовать подграф (фрагмент графа
родственных отношений), по которому можно определить необходимое отношение.
2. Если в графе нет необходимого подграфа, то дополните граф соответствующим образом.
II. Выполните поиск по составленному правилу и объясните количество
найденных решений.
23
4. Базы знаний «Вычисления»
Хотя языки логического программирования создавались, прежде всего, для
нечисловых задач, наличие встроенных арифметических предикатов позволяет
решать и вычислительные задачи. При этом, как правило, используются рекурсивные базы знаний. Рассмотрим несколько примеров.
Наибольший общий делитель
Программы вычисления НОД основаны на использовании следующих
свойств и рекурсивных соотношений:

НОД равных чисел равен любому из них;

НОД (а,в) = НОД(а-в,в), если а > в;

НОД (а,в) = НОД(а,в-f), если в > а;
1. Используемый предикат:
нод ( < 1 число >,< 2 число >,<нод этих чисел>)
Программа
нод(а,а,а);
нод(а,в,с) :  БОЛЬШЕ(а,в), СЛОЖЕНИЕ(р,в,а), нод(р,в,с);
нод(а,в,с) :  БОЛЬШЕ(в,а), СЛОЖЕНИЕ(р,а,в), нод(а,р,с);
?нод(10,15,с);
c=5
2. Используемые предикаты:
нод ( < 1 число >,< 2 число >,<нод этих чисел>)
выч (<уменьшаемое>,<вычитаемое>,<разность>)
Программа
нод(а,а,а);
выч(а,в,с) :  СЛОЖЕНИЕ(с,в,а);
нод(а,в,с) :  БОЛЬШЕ(а,в),выч(а,в,р), нод(р,в,с);
нод(а,в,с) :  БОЛЬШЕ(в,а),выч(в,а,р), нод(а,р,с);
?нод(10,15,с);
c=5
24
3. Используемый предикат:
нод ( < 1 число >,< 2 число >,<нод этих чисел>)
Синтаксис ПРОЛОГа-д позволяет использовать простейшие арифметические
выражения (они окружаются символами #).
Программа
нод(а,а,а);
нод(а,в,с) :  БОЛЬШЕ(а,в), нод(#а-в#, в, с);
нод(а,в,с) :  БОЛЬШЕ(в,а), нод(а,#в-а#, с);
?нод(10,15,с);
c=5
Числа Фибоначчи
Программы основаны на использовании следующего свойства чисел
Фибоначчи: Фn =Фn-1 + Фn-2 , где Фn – n-ое число Фибоначчи. При этом первые
два числа Фибоначчи задаются изначально.
1. Используемый предикат:
фиб ( < номер >,< число >)
Программа
фиб(0,0);
фиб(1,1);
фиб(н,ч) :  фиб(#н-1#,а), фиб(#н-2#,в), СЛОЖЕНИЕ(а,в,ч);
?фиб(6,ч),!;
ч=8
2. Используемый предикат:
фиб ( < номер >,< число >,<предыдущее число>)
Программа
фиб(1,1,0);
фиб(н,ч,п) :  фиб(#н-1#,п,с), СЛОЖЕНИЕ(п,с,ч);
?фиб(6,ч,_),!;
ч=8
25
Замечание. Вторая программа более быстродействующая, так как требует выполнения н-1 рекурсивного вызовы, в то время как первой программе
необходимо выполнение 2н-3 рекурсивных вызовов.
Угадай число
Все рассмотренные выше БЗ были лишены интерактивных возможностей, пользователю нельзя было вводить информацию, а компьютеру выводить информацию в ходе решения задачи. В Прологе-Д имеются встроенные
предикаты, позволяющие это делать:
ВВОДЦЕЛ(<арг>) - в качестве аргумента может использоваться целочисленная константа или переменная, конкретизированная целым;
ВЫВОД(<арг>) - в качестве аргумента может использоваться литерная константа или литерная переменная.
Замечание. При использовании интерактивности вывод результата работы программы осуществляется на текстовый экран (меню «Настройки»).
Рассмотрим игровую интерактивную программу, в ходе работы которой
пользователь должен угадать число, «задуманное» машиной.
Используемые предикаты:
повт – для организации повторов
пров(<введенное число>,<задуманное число>)
ПС - перевод строки
ЛОЖЬ – всегда ложен
Угадай
Программа
повт:
повт:  повт;
пров(х,у) :  БОЛЬШЕ(х,у), ВЫВОД(перелет), ПС, ЛОЖЬ;
пров(х,у) :  МЕНЬШЕ(х,у),ВЫВОД(недолет), ПС, ЛОЖЬ;
пров(х,х) :  ВЫВОД(угадал),!;
угадай:  повт, ВЫВОД(введи_число), ВВОДЦЕЛ(х), ПС, пров(х,5);
?угадай;
26
10
Перелет
3
Недолет
5
Угадал
Задания для самостоятельной работы
1. Реализуйте на компьютере программы БЗ «Наибольший общий делитель» (3
варианта). Определите экспериментально, начиная с каких чисел происходит
переполнение стека.
2. Реализуйте на компьютере программы БЗ «Числа Фибоначчи» (2 варианта).
Сравните время выполнения соответствующих программ. Установите максимальный номер числа Фибоначчи, при вычислении которого не происходит
переполнение стека.
3. Сыграйте с машиной в игру «Угадай число». Что нужно знать, чтобы сформулировать оптимальную стратегию поведения играющего? Сформулируйте
оптимальную стратегию. Запишите формулу для определения максимального
числа попыток необходимых для отгадывания числа игроку, использующему
оптимальную стратегию.
5. Базы знаний «Списки»
Список представляет собой упорядоченную совокупность однородных
объектов. В Прологе-Д при задании списков используется следующий синтаксис:
Список :: = [] | [Арг{, Арг}] | [А|В]
А :: = Арг{, Арг}
В :: = Список
Арг :: = Константа | Переменная,
конкретизированная целым | Список
Константа ::= Целое | {Символ}
27
Запись [] используется для обозначения пустого списка. Список в форме [А|В]
удобно использовать в рекурсивных БЗ, А - начало (один или несколько элементов), В - остаток (подсписок всего списка).
Замечание. При работе со списками в ходе автоматического перебора вариантов, если нет соответствующих ограничений, каждый список разбивается
на начало и остаток всеми возможными способами:
[а,в,с] =[а | [в,с] ] =[а,в | [с] ] =[а,в,с | [] ].
1. Переход от одного способа задания списка к другому.
?РАВНО(х, [1|[2,3,4] ]);
х=[1,2,3,4]
?РАВНО([х|у],[1,2,3] ]);
х=1
у=[2,3]
2. Определение принадлежности элемента списку.
Используется предикат:
эл(<элемент>,<список>)
эл(э,[э|к]);
эл(э,[х|у]): эл(э,у);
?эл(3,[6,7,3,4]);
Да
?эл(9,[6,7,3,4]);
Нет
3. Конкатенация (сложение) списков.
Используется предикат:
конк((<1-й список>,<2-й список >,<1+2 список>));
конк([],х,х);
конк([х|у],к,[х|р]) :  конк(у,к,р);
? конк([1,2,3],[4,5,6],х);
х=[1,2,3,4,5,6]
? конк([Вера,Надежда],[Любовь],х);
28
х=[ Вера,Надежда,Любовь]
Поскольку решение задач при использовании логического программировании заключается в переборе допустимых вариантов, то многие предикаты
можно использовать для решения обратных задач:
? конк(х, [4,5,6],[1,2,3,4,5,6]);
х=[1,2,3]
Можно получить все разбиения списка на два подсписка:
? конк(х,у,[1,2,3]);
х=[]
х=[1]
х=[1,2]
х=[1,2,3]
у=[1,2,3]
у=[2,3]
у=[3]
у=[]
4. Удаление элементов из списка.
Используется предикат:
уд (<удаляемый элемент>,<исходный список >,<результирующий список>);
уд(х,[х|у],у);
уд(х,[н|у],[н|к]): уд(х,у,к);
?уд(3,[1,2,3],х);
х=[1,2]
Обратная задача – добавление элемента в список:
?уд(8,х,[1,2]);
х=[8,1,2]
х =[1,8,2]
х =[1,2,8]
5. Обращение списка.
Используется предикат:
об(<исходный список>,<обращенный список >)
об([],[]);
об([х|у],о) :  об(у,п),конк(п,[х]*),о);
?об([1,2,3],о);
о=[3,2,1]
_____________________________________________________________________________
*) [х] -список, содержащий 1 элемент (скобки обязательны)
29
6. Выделение всех подсписков списка
Используется предикат:
под(<подсписок>,<исходный список >);
под([],[]);
под([х|к],[ х|у]):  под(к,у);
под(п,[ х|у]):  под(п,у);
?под(х, [1,2,3]);
х=[1,2,3]
х=[1,2]
х=[1,3]
х=[1]
х=[2,3]
х=[2]
х=[3]
х=[]
7. Выделение минимального элемента списка.
Используется предикат: мин(<минимальный элемент>,<список >);
мин(х, [х]);
мин(м,[ х|у]) :  мин(п, у),БОЛЬШЕ(п,х),РАВНО(м,х);
мин(м,[ х|у]) :  мин(п, у),НЕ(БОЛЬШЕ(п,х)),РАВНО(м,п);
?мин(х, [3,2,5]);
х=2
8. Определить упорядочен ли список в порядке возрастания (неубывания).
Используется предикат:
прупв(<список>);
прупв([х]);
прупв([х|у]) :  прупв(у),мин(м,у),НЕ(БОЛЬШЕ(х,м));
?прупв([1,2,3]);
Да
30
?прупв(3,[1,2]);
Нет
9. Упорядочить список в порядке возрастания (неубывания).
Эта задача более сложная, чем предыдущая. Для её решения необходимо
найти в списке минимальный элемент, поставить его начало списка и упорядочить требуемым способом остаток списка, являющийся подсписком исходного списка. БЗ для поиска минимального элемента и удаления элемента из
списка рассмотрены. Для постановки минимального элемента в начало списка
используем предикат:
мин1(<исходный список>,<результирующий список >);
мин1([х],[х]);
мин1(х,[м|у]) :  мин1(м,х),уд(м,х,у);
?мин1([3,2,1],х);
х=[1,3,2]
Для всей задачи воспользуемся предикатом
упв(<исходный список>,<упорядоченный список >)
упв(([х|[у]],[х||[у]]):  НЕ(БОЛЬШЕ(х,у));
упв(([х|[у]],[у|[х]]):  БОЛЬШЕ(х,у);
упв(([х|у],[м|к]): мин1([х|у], [м|т]),упв(т,к);
?упв([3,2,-1],х);
х=[-1,2,3]
Задания для самостоятельной работы
Составьте БЗ для решения следующих задач:
1. Выделение первого элемента списка.
2. Выделение последнего элемента списка.
3. Удаление первого элемента списка.
4. Удаление второго элемента списка.
5. Выделение второго элемента списка.
6. Добавление первого элемента списка.
7. Удаление последнего элемента списка.
31
8. Удаление предпоследнего элемента списка.
9. Выделение предпоследнего элемента списка.
10.Добавление последнего элемента списка.
11.Перестановка местами первого и последнего элементов списка.
12.Генерация всех перестановок элементов списка.
13.Подсчет числа элементов списка.
14. Проверка на равенство всех элементов списка
15. Выделение максимального элемента списка.
16. Постановка максимального элемента в начало списка.
17. Постановка максимального элемента в конец списка.
18. Упорядочивание списка в порядке невозрастания.
19. Выделение из списка всех подсписков заданной длины.
20. Разбиение пополам списка четной длины.
III. Система логического программирования Турбо Пролог
В отличие от Пролога-Д система Турбо Пролог является англоязычной. К
достоинствам её можно отнести: большее разнообразие типов данных (6) ,
развитые диалоговые и сервисные средства (возможна трассировка программы
при отладке, при обнаружении синтаксической ошибки курсор останавливается на соответствующей строке программы), более привычную математическую нотацию (символы < , >, = вместо соответствующих слов) и ряд других
удобств.
1. Синтаксис языка
Структура программы
С помощью служебных слов выделяются следующие разделы программы:
domains
< определение типов данных>
predicates
32
<описание предикатов >
clauses
<БЗ: перечень фактов и правил >
goal
< цель: содержание вопроса к БЗ >
Раздел domains может отсутствовать, его обычно вводят для повышения
наглядности программы - присваивания аргументам предикатов имен, несущих содержательный смысл или обладающих более короткой записью, вместо
имен стандартных типов данных. Эти имена используются в разделе predicates
при описании предикатов.
Раздел goal может располагаться как после, так и до раздела clauses. При
этом машина логического вывода ищет только одно решение (внутренняя
цель). Если необходим поиск всех возможных решений, то цель (внешняя)
указывается в другом окне отдельно от программы.
Комментарии к программе можно писать по-русски и располагать в любом месте. Если комментарий занимают всю строку, то он оформляется так:
/*<комментарий>*/, если комментарий идет в строке после предложения программы, то он оформляется так: … %<комментарий>.
Типы данных
symbol – последовательность латинских букв и символов подчеркивания
( не более 250), начинающаяся со строчной буквы или заключенная в кавычки
(при этом допустимы заглавные буквы и буквы русского алфавита).
Примеры: a1, kto, «Петя», kto_kyda.
string – любая последовательность символов с теми же ограничениями,
что и для типа symbol, заключенная в кавычки.
Примеры: «кочан», «123/456», «а1»*).
char – отдельный символ в кавычках.
*) Данные типа symbol в отличие от данных типа string запоминаются в таблице символов,
размещаемой в ОЗУ, и поэтому её использование обеспечивает более быстрый поиск информации.
33
Примеры: «А», «*», «?», «3».
integer – целое число в диапазоне от -3768 до 32767.
real – действительное число в диапазоне от 1Е-307 до 1Е308.
Примеры: 3.14, -6514, 1.25Е15.
file – имя файла DOS
Имена переменных
Имена начинаются с заглавной буквы и могут содержать буквы (латинские), цифры и некоторые специальные символы (не более 250). Длинные
имена не допускают пробелов (используется знак подчеркивания). Знак подчеркивания используется также для записи анонимных переменных
Имена предикатов
Имена начинаются со строчной буквы. В остальном правила такие же,
как и для имен переменных.
Запись предложений
В фактах указывается имя предиката, а затем в круглых скобках через
запятую перечисляются аргументы. Запись каждого предложения заканчивается точкой.
Пример: mama(«Маша», «Лида»).
В правилах связка «ЕСЛИ» может обозначаться как символами «:–» или
«<–», так и словом «if». В теле правила для обозначения связки «И» может
использоваться как запятая, так и союз «and». Связка «ИЛИ» может реализовываться или через два правила с одинаковыми головами, или с помощью союза «or». Связка «НЕ» задается словом «not».
Примеры:
1) Можно записать некоторое правило так
p(X,Y) if (p1(X) and not p2(Y)) or (p3(X) and p4(Y)).
или так
p(X,Y) : p1(X), not p2(Y).
p(X,Y) : p3(X),p4(Y).
2) babyshka(X,Y) :  mama(X,Z),mama(Z,Y).
34
Стандартные предикаты
В Турбо Прологе насчитывается несколько десятков встроенных предикатов. Приведем некоторые из них, связанные с вводом и выводом информации на экран.
Ввод информации:
readint(<переменная целого типа >)
readchar(<переменная типа char >)
readreal(<переменная вещественного типа >)
readln(<переменная типа string >)
Вывод информации:
nl – перевод строки
write(<список переменных или констант>)
2. Интерфейс системы
Предложения БЗ вводятся в окно встроенного редактора. Всего имеется
четыре окна: окно редактора (текст программы), окно сообщений (результаты
трансляции), окно диалога (внешняя цель и результаты поиска), окно трассировки (сообщения о ходе трассировки).
Из всех четырех окон активным одновременно может быть только одно
окно, оно выделяется двойной рамкой. Переключение активных окон происходит по циклу нажатием клавиши F6. Выключение активного окна и переход
в главное (верхнее) меню по клавишам ESC или F10. Перемещение по главному меню клавишами управления курсором. Запуск программы на трансляцию (Compile), на трансляцию и исполнение при отсутствии ошибок (Run).
Состав меню Files:

load – загрузка программ

Pick – вызов списка 7 последних исполнявшихся программ

New file – очистка памяти перед вводом новой программы

Save – запись программы под текущим именем

Write to – запись программы под новым именем
Работа со встроенным текстовым редактором Edit:
35

пометка начала блока (ctrl+KB)

пометка конца блока (ctrl+KK)

копирование блока (ctrl+KC)

перемещение блока (ctrl+KV)

уничтожение блока (ctrl+KY)

включение/выключение выделения блока (ctrl+KH)
Options: задание параметров компоновщика программ.
Setup: установка параметров системы (размеры, положение, цвет окон, цвет
символов количество строк и столбцов в текстовом режиме монитора и т.д.)
Размер каждого окна можно увеличить до полного экрана или свернуть до исходного размера клавишей F5.
Для трассировки программ при отладке необходимо выполнить следующее:
1. Перед программой помещается стандартный предикат trace, если необходимо отлаживать всю программу, и trace p1,p2, если необходимо отлаживать
фрагмент программы между предикатами p1 и p2.
2. Запуск программы на исполнение (Run).
3. Исполнение по шагам при каждом нажатии клавиши F10.
4. Сообщения в ходе исполнения программы в окне трассировки:

CALL: имя исполняемого предиката и значения его аргументов

RETURN: *имя предиката , когда предикат или правило удовлетворяются

FAIL: имя предиката, который не удовлетворяется

REDO: ситуация поиска с возвратом.
Замечание. При выполнении стандартных предикатов, которые всегда
истинны (например, write) соответствующие сообщения в окне трассировки не
выводятся.
36
Примеры. Реализации в среде Турбо Пролог учебных БЗ.
1. БЗ «Родственники». В окне редактора (рис.3) находится фрагмент этой БЗ.
После исполнения программы (клавиша «Run») в окне диалога появляется результат – текст «Маша бабушка Тони».
Рис.3
Если не указывать локальную цель в окне редактора (рис.4), то после запуска
программы в окне диалога появится приглашение «Goal:» ввести глобальную
цель. После ввода b(X,Y) будут выведены все возможные решения и приведено их число (в рассматриваемом примере решение одно). Указывать предикат
вывода результата на экран (write) для глобальных целей не требуется
Рис.4
37
2. БЗ «Списки». В окне редактора (рис.5) приведена программа выделений
минимального элемента списка без указания локальной цели.
Рис. 5
После ввода глобальной цели «min(X,[3,2,-1])» в окне диалога появляется информация о найденном решении и их количестве. После чего система отвечать
на новый вопрос: снова появляется приглашение «Goal:».
3. Графический режим
Используется следующая система координат
(0,0)
639
X
199
Y
Структура программы
До первого обращения к графическим предикатам необходимо установить графический режим работы монитора:
initgraph(<1>,<2>,<3>,<4>,<5>).
<1> - цифровой идентификатор используемого драйвера (3)
38
<2> - код графического режима (0 - код соответствует 640 на 200 пикселей)
<3> - несущественный параметр (_ - анонимная переменная)
<4> - несущественный параметр (_- анонимная переменная)
<5> - путь к драйверу (” ’’ - драйвер в рабочем каталоге).
Таким образом, открываем графический режим предикатом
initgraph(3,0,_,_, ” ”).
После последнего обращения к графическим предикатам графический
режим следует закрыть предикатом closegraph.
Если БЗ содержит только графические предикаты, то открытие и закрытие графического режима можно указывать непосредственно в вопросе:
goal initgraph(3,0,_,_, ” ”),<содержание вопроса>, readchar(_),closegraph.
Замечание. Предикат readchar(_) необходим для того, чтобы изображение
сохранялось на экране пока не будет введен какой-либо символ.
Графические предикаты
setbkcolor (<код цвета фона>):
0 – черный, 1- синий, 2 –зеленый, 3 – голубой, 4 – красный, 5 – фиолетовый
6 – коричневый, 7 – светлосерый, 8 – темносерый, 9 – яркосиний, 10 – яркозеленый, 11 – яркоголубой, 12 – розовый, 13 – малиновый, 14 – желтый,
15 – белый;
setcolor (<код цвета пера>), коды цветов пера такие же как и для цвета фона;
moveto(<X>,<Y>) – позиционирование графического курсора: X – координата
по оси абсцисс, Y – координата по оси ординат;
moverel(<X>,<Y>) – перемещение графического курсора по оси абсцисс не
величину X, а по оси ординат на Y;
line(<X1>,<Y1>,<X2>,<Y2>) – отрезок прямой от точки с координатами X1,
Y1 до точки с координатами X2,Y2;
linerel(<X>,<Y>) – отрезок прямой от текущей точки до точки с измененными координатами по оси X на X, а по оси Y на Y;
lineto(<X>,<Y>) – отрезок прямой от текущей точки до точки с координатами
X и Y;
39
rectangle(<X1>,<Y1>,<X2>,<Y2>) –
прямоугольник
со сторонами парал-
лельными осям координат; X1 и Y1 – координаты левой верхней точки; X2 и
Y2 – координаты правой нижней точки;
bar(<X1>,<Y1>,<X2>,<Y2>) – такой же прямоугольник закрашенный текущим цветом пера;
circle(X,Y,R) – окружность с центром в точке с координатами X и Y и радиусом R;
arc(X,Y,н, к,R) – дуга окружности с центром в точке с координатами X и Y
и радиусом R от угла н до к , отсчитываемым против часовой стрелки;
ellipse(X,Y,н, к,R, Xo,Yo) – дуга от угла н до к эллипса с центром в точке
(X,Y) и полуосями Xo,Yo;
fillellipse(X,Y,Xo,Yo) – закрашенный эллипс с центром в точке (X,Y) и полуосями Xo,Yo;
Вывод текста на графический экран:
settextstyle(<А1>,<А2>,<А3>):
А1 – тип шрифта (значения от 0 до 4);
А2 – направление текста (0 :
; 1: );
А3 – размер шрифта (от 0 до 2);
outtextxy(X,Y,T) – выводит на экран с позиции(X,Y) текст, заданный в переменной T типа string или непосредственно строковой константой, заключенной в кавычки);
outtext(T) – выводит на экран с текущей позиции текст, заданный в переменной T типа string или непосредственно строковой константой, заключенной в
кавычки).
Примеры:
1.БЗ «Дерево». Изображение дерева строится из отрезка прямой – ствола и
кроны – окружности. В окне редактора (рис. 6) находится программа построения указанного изображения. Поскольку все предикаты программы графические, то открытие и закрытие графического режима указано непосредственно
40
Рис.6
в вопросе. После выхода из режима редактирования (ESC) и запуска программы (клавиша «Run») на графическом экране (рис. 7) на желтом фоне появится стилизованное изображение дерева с коричневой прямой – стволом и
зеленой окружностью – кроной. Изображение будет находиться на экране до
тех пор, пока не будет нажата любая клавиша (используется предикат
readchar(_)).
Рис 7
41
2. БЗ «Аллея». В окне редактора (рис. 8) находится программа построения
аллеи, состоящей из 5 вышеприведенных деревьев.
Рис.8
Изображение (рис. 9) появляется после нажатия клавиши «Run».
Рис.9
42
Задания для самостоятельной работы
1. Реализовать в системе Турбо Пролог БЗ «Дерево», строящую дерево с
закрашенной зеленой кроной.
2. Реализовать в системе Турбо Пролог БЗ «Сад», изображение которого
включает 3 аллеи, каждая из которых состоит из 7 деревьев.
3. Реализовать в системе Турбо Пролог задания для самостоятельной работы по БЗ «Родственники».
4. Реализовать в системе Турбо Пролог БЗ «Вычисления».
5. Реализовать в системе Турбо Пролог задания для самостоятельной работы по БЗ «Списки».
Литература
1. Братко И. Программирование на языке Пролог для искусственного интеллекта. – М.: Мир, 1990. – 560с.
2. Малпас Дж. Реляционный язык Пролог и его применение: Пер. с англ./
Под редакцией. В.Н. Соболева. – М.: Наука,1990. – 464с.
3. Янсон А. Турбо – Пролог в сжатом изложении. – М.: Мир, 1991.
4. Системы искусственного интеллекта и язык Пролог в обучении: Учебное
пособие к автоматизированному курсу / Зеленин В.М., Керов Л.А., Серегин. И.А. – СПб.: Образование, 1996. – 102с.
5. Шрайнер П.А. Основы программирования на языке Пролог: курс лекций:
учеб. пособие. – М.: Интернет – Ун-т Информ. Технологий, 2012. – 176с.
43
Download