Интеллектуальные информационные системы 6

КР 070440328                                                                  1



	

	Министерство высшего образования и науки РФ

	Государственного образовательного учреждения 

	Высшего профессионального образования

	Тихоокеанского государственного университета

	Институт экономики и управления

	Специальность «Прикладная информатика в экономике»

	Кафедра «Экономическая кибернетика»

	

	

	

	

	

	

	

	

	

	

	

Курсовая  работа по дисциплине:

	«Интеллектуальные информационные системы»

	

	

	

	

	

	

	

	

	

	

	

	

	                                                                                               Выполнила: Махонина Анна 

	                                                                                                                       Владимировна

	                                                                                               Специальность ПИЭ З/У

	                                                                                               № зач. Книжки 070440328

	                                                                                               Проверила: Серебрикова Татьяна

	                                                                                                                         Александровна

	

	

	

	

	

	Хабаровск 2009 г.



Задание на курсовую работу

РАБОТА С СИСТЕМОЙ  Пролог-Д



Ва- риант

Тема1

Тема2

Тема2

Тема2

Тема2



Факты и правила.



Арифметика и другие встроенные предикаты

Рекурсия



Графические возможности системы

Обработка списков





№ задания

№ задания

№ задания

№ задания

№ задания

8

1.1.2., 2.1.2

2.2.4.,  2.2.5

2.3.2.,  2.3.1.

2.4.1

2.5.4.



1.1.2. Опишите на языке ЛОГИКИ ПЕРВОГО ПОРЯДКА свойства отношения равенство.

2.1.2. Опишите на языке Пролог-Д состав своей семьи.

2.2.4. На языке Пролог-Д напишите БАЗУ ЗНАНИЙ, в которой определяется функция, заданная соотношением:

          x, если x <-1,

F(x)=	 x+1, если -1<x<1,

	x, если x >1.

2.2.5. Какие сложности могут возникнуть в базе знаний о мамах, если у двух мам дети будут тезками? Напишите программу на Прологе-Д, которая находит имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.

2.3.2. Написать на языке Пролог-Д базу знаний, описывающую ВЫЧИСЛЕНИЕ СУММЫ ЧИСЕЛ НАТУРАЛЬНОГО РЯДА.

2.3.1. Написать на языке Пролог-Д базу знаний, описывающую вычисление ФАКТОРИАЛА.

2.4.1. Напишите на языке Пролог-Д базу знаний, описывающую прямоугольный треугольник.

2.5.4.  Напишите базу знаний, описывающую удаление n-oго элемента списка.

                                                      Руководитель:                                      

                                                                                                (подпись)







Реферат

  Пояснительная записка к курсовой работе содержит 34 листов формата А4, 1 рисунок, 1 таблица, 6 использованных источников.

 БАЗА ЗНАНИЙ - центральная часть экспертной системы. Она содержит факты, правила и эвристики, представляющие экспертные знания о предметной области. Можно представлять базу знаний состоящей из фактических знаний и знаний, которые используются для вывода других знаний. 

 ИСКУСТВЕННЫЙ ИНТЕЛЕКТ, ЭКСПЕРНЫЕ СИСТЕМЫ, ТЕРМ, ПРЕДИКАТ, ФОРМУЛА, ПРЕДЛОЖЕНИЕ, ВОПРОС, ДАННЫЕ, БАЗА ДАННЫХ, ФАКТЫ  И ПРАВИЛА, АРИФМЕТИКА И ДРУГИЕ ВСТРОЕННЫЕ ПРЕДИКАТЫ, РЕКУРСИЯ, ГРАФИЧЕСКИЕ ВОЗМОЖНОСТИ СИСТЕМЫ ПРОЛОГ-Д, ОБРАБОТКА СПИСКОВ

  Объектом исследования курсовой  работе являются базы знаний, которые могут применяться в экономике.  Цель работы – закрепление знаний, полученных в процессе изучения дисциплины «Интеллектуальные информационные системы», а также формирование целостной системы этих знаний о  предмете; практическая реализация баз знаний с помощью языка логического программирования ПРОЛОГ-Д; раскрытие взаимосвязи всех понятий и их внутренней логики; привитие навыков формирования задач логического программирования; расширение познаний об интеллектуальных информационных системах и важность их применения в экономике.

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

 Курсовая работа выполнена с использованием специальных программ PROLOG-D и Microsoft Word.

















  



















СОДЕРЖАНИЕ

Введение................................................................................................................5

1. Назначение и область применения программы Пролог-Д..................6

2. Логические основы работы системы Пролог-Д. …..............................7

3. Построение базы знаний.......................................................................12

4. Арифметика и другие встроенные предикаты в Прологе-Д.............. 15

5. Рекурсия.................................................................................................19

6. Графические возможности системы Пролог-Д …...............................23

7. Обработка списков................................................................................27

8. Задания.................................................................................................

Список используемой литературы………………………………………….



























































Введение



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

По определению Комитета по Экспертным Системам Британского Компьютерного Общества, под экспертной системой понимается «воплощение в ЭВМ компонента опыта эксперта, основанного на знании, в такой форме, что машина может дать интеллектуальный совет или принять интеллектуальное решение относительно обрабатываемой функции». Желательная дополнительная характеристика (которую многие считают главной) - способность системы по требованию объяснить ход своих рассуждений понятным для спрашивающего образом.

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

В настоящее время ЭС внедряются в различные виды человеческой деятельности, где использование точных математических методов и моделей затруднительно или вообще невозможно. К ним относятся: медицина, обучение, поддержка принятия решений и управление в сложных ситуациях, различные деловые приложения и т. д.

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





1.Назначение и область применения программы Пролог-Д.



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

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

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

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

Система искусственного интеллекта, созданная для решения задач в конкретной проблемной области, называется экспертной системой. Источником знаний для наполнения экспертных систем служат эксперты, работающие в соответствующей предметной области.

 В течение последних десятилетий в рамках исследований по искусственному интеллекту (ИИ) сформировалось новое самостоятельное направление – экспертные системы (ЭС), или инженерия знаний (ИЗ).

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

 В задачу этого направления входят исследование и разработка программ, использующих знания и процедуры вывода для решения задач, являющихся трудными для людей-экспертов. В отличие от специализированных систем ИИ экспертные системы могут быть отнесены к системам ИИ общего назначения – системам, которые не только исполняют заданные процедуры, но на основе метапроцедур поиска генерируют и используют процедуры решения новых конкретных задач.  





Логические основы работы системы Пролог-Д.



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

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

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

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

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

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

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

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

Терм - это переменные, константы и функции вида 



f(t1,t2,...,tn),(t1,t2,...,tn),                  (2.1) 

                                       

 где каждое ti – терм;  

 f - n-арный функциональный символ или функтор.                            

 Арностью называют число аргументов. Особенность функции (2.1) в том, что она принимает значение элемента предметной области Dn , или иными словами представляет собой некоторое отображение совокупности из n (n - ки) элементов из предметной области в элемент области.

Отношения, определяемые над объектами, отличаются от функций. Отношение определяет совокупность элементов из предметной области и представляет собой отображение из D n в множество {ИСТИНА, ЛОЖЬ}. Например, отношение мама(x, y) определяет совокупность пар (x, y), таких, что элементы множества людей x и y находятся в отношении родства мама. Множество пар (x, y) это множество матерей и детей. В математической логике отношениям даются имена, называемые предикатными символами, а сами отношения называются предикатами в последнем примере предикатный символ-мама.

Дадим более строгое понятие предиката.

Предикат - это выражение вида



 P(t1,t2,...,tm),                     (2.2)

                                              

     где каждое ti – терм; 

     P - m-арный предикатный символ. 

Формально предикат (2.2) можно читать либо как "m - ка (t1,t2,...,tm) принадлежит отношению Р", либо как высказывание Р справедливо для m-ки (t1,t2,...,tm).

В логике имеется набор связок.

Пример

     &, , ¬, <- , <->, которые читаются как "и", "или", "не", "если", "тогда и только тогда".

       

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

Пример 

Необходимо отметить, что логические связки: &, , ¬, <- , <-> могут быть выражены друг через друга с помощью следующих соотношений, называемых формулами сокращения



     (AB)   означает  ¬(A<-B),                            

     (A\/B)  означает   (¬A)<-B,       

     (A<->B) означает (A<-B)(B<-A),



где А и В - суть формулы. 



Наряду со связками существуют кванторы общности () и существования (). Кванторы определяют пределы изменения переменных. Формула, стоящая после квантора называется областью действия этого квантора. Для кванторов тоже существуют формулы сокращения 



      xА означает	(¬(x(¬А))),                  (2.6)



     где х - переменная;

     А- формула.                     

Пример

Приведем примеры формул

мама(x, y)мама(y, z);

F1F2F3¬F4, если F1,F2,F3,F4 - формулы.

Q(F1,F2), если F1 и F2 - формулы, а Q - квантор существования () или общности ().

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

Предложение - это формула, в которой каждая переменная находится в области действия квантора общности.

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

Предложения, построенные в соответствии с введенными выше правилами, образуют язык логики первого порядка. В этом языке термы представляют собой объекты, а предикаты отношения между объектами. С помощью этого языка можно описать все задачи, решаемые на ЭВМ. На основе языка логики первого порядка можно построить различные языки логического программирования, различающиеся по правилам формирования предложения. Среди множества всевозможных предложений особое значение имеют предложения, содержащие связки "и" и одну связку "если". Такие предложения называются дизъюнктами. Дизъюнкт - это предложение вида



    A1A2...AkB1B2...Bn,			    (2.7)    



где A1,A2,...,Ak,B1,B2,...,Bn - предикаты или литеры;

 - связка "и";

<- - связка "если".

Особое значение для Пролога-Д имеет понятие дизъюнкта Хорна, играющий важную роль при составлении баз.

Дизъюнктом Хорна называется такой дизъюнкт, у которого k равно 0 или k равно 1. При k равно n равно 0 получается пустой дизъюнкт, обозначаемый символом Л.

Если k равно 0, то из формулы (2.7) получается дизъюнкт 



          B1B2...Bn,                        (2.8)                                            



Этот дизъюнкт называется вопросом.

Среди множества всех дизъюнктов особую роль играют те, для которых k равно 1. Если при этом еще и n равно 0, то такой дизъюнкт называется фактом A1.

Если же n больше0, дизъюнкт называется правилом



     A1<-B1B2...Bn,                         (2.9)                        



где A – голова;

     B1B2...Bn, - цели, образующие тело правила.

Необходимо отметить свойство формул (2.7). Если воспользоваться, приведенными выше формулами сокращения, связывающими логические связки, то оказывается, что любой дизъюнкт можно преобразовать к такой формуле, что в записи ее будут использованы только связки (или),(не).

Базой знаний (БЗ) будет называться всякое (непустое) множество фактов и правил.

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



               (x>y)<-(|x|>|y|),                (2.10)                                   



где знак x>y - означает отношение "x больше y";

     знак |x| - абсолютную величину x, истинна, если x и y       принадлежат множеству положительных чисел и ложна, если x и y принадлежат множеству отрицательных чисел. 

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

Для интерпретации множества предложений S выбирается множество объектов D, называемое областью интерпретации.

Интерпретация множества предложений S над D состоит из следующих трех соответствий.



Пример

а) каждой константе (числовой или литеральной) ставится в соответствие некоторый элемент из D.

б) каждому  n-арному  функтору  из  S  сопоставляется отображение n-ки из Dn в D.

в) каждому n-арному предикатному символу  из S сопоставляется отображение n-ки из области Dn в множество {ИСТИНА, ЛОЖЬ}.

База знаний и следующий за ней вопрос представляют собой программу на Прологе-Д.

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

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

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

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



    Пример

Рассмотрим  программы логических основ в Прологе с использованием формул сокращения, написать базу данных о городах государств, используя связки «не» и «или».

Представим базу знаний, она содержат информацию о названиях государств и городах, которые принадлежат этим государствам. Используя связки «не» и «или» запишем два правила (строка 5 и 6), характеризующие принадлежность государства к российскому или иностранному и зададим вопрос, используя связку «или», к базе



     ?ИЛИ(российское(x),иностранное(x));



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

 























Построение базы знаний.

Факты и правила.



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

 Иными словами, создание информационно-логической модели описываемого на языке Пролог-Д этого явления или процесса. Основное назначение данного раздела состоит в описании методики разработки баз знаний, на примерах достаточно простых, заимствованных из традиционной практики. Первый шаг в направлении построения базы знаний состоит в выявлении объектов и соотношений между ними, отвечающих на вопрос: "Что дано?". Такую информацию целесообразно представлять в виде совокупности фактов. Классическим примером фактографии служит англо-русский словарь. Записанный средствами Пролога-Д он выглядит так:



русангл(мама, mammy);

русангл(небо, sky);

русангл(солнце, sun);

русангл(мальчик, boy);

русангл(круг, ring);

русангл(вокруг, arоund);,


и так далее. Последовательность фактов можно и продолжить, но уже сейчас достаточно слов, чтобы перевести на английский известную детскую песню. Подобные отношения представляют собой грамматическую конструкцию Пролога-Д, называемую фактом. Факт задается в виде функционалa: имя, и совокупность аргументов. В данном примере "русангл" - это имя факта оно определяет информацию, записываемую в нем. Русские и английские слова: мама, mammy, небо, sky, солнце, sky, мальчик, boy представляют собой аргументы факта, определяющего взаимно однозначное соответствие между русскими и английскими словами. Необязательно, чтобы факт имел два аргумента. Например, факт: мужчина(Николай); имеет один аргумент - Николай и имя - мужчина, а факт родился(Петров,Иван,10,сентябрь,1979); имеет пять аргументов - Петров, Иван, 10, сентябрь, 1979 и имя родился. Однако, с точки зрения синтаксиса языка Пролог-Д, необходим хотя бы один аргумент. Если факт в базе знаний имеет имя и не имеет аргументов, то система выдаст сообщение о синтаксической ошибке. Приведенный пример, по сути дела, уже является базой знаний на языке Пролог-Д. К этой базе знаний можно задавать различные вопросы:



?русангл(y,x); - если необходимо узнать, все слова, хранящиеся в базе знаний,



?русангл(мама, x); - если необходимо узнать как по английски мама?



?русангл(x, sky); - если необходимо узнать, что означает слово sky? 



 Для описания всего множества информации, вообще говоря, достаточно фактов. Однако если возможно задать некоторые связи и отношения между объектами, то удается сократить число фактов, и тем самым сделать базу знаний более лаконичной. Связи и отношения между объектами задаются правилами. При построении правил выделяется совокупность отношений, отвечающих на вопрос "Что известно?".

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

 Например, в задаче о построении родственных отношений можно определить следующие правила:


бабушка(x,y)<-мама(x,z),мама(z,y);
бабушка(x,y)<-мама(x,z),папа(z,y);
дедушка(x,y)<-папа(x,z),папа(z,y);
дедушка(x,y)<-папа(x,z),мама(z,y);



 Глубина процесса декомпозиции в данном случае автоматически устанавливается. Она определена понятиями "мама", "папа".

 Процесс декомпозиции не обязательно однозначен. Даже простой пример о родственниках допускает и иную трактовку. Если ввести правило, определяющее понятие "родитель" 



родитель(x,y)<-мама(x,y);

родитель(x,y)<-папа(x,y);,



то бабушку и дедушку можно определить проще:



бабушка(x,y)<-мама(x,z),родитель(z,y);

дедушка(x,y)<-папа(x,z),родитель(z,y);.



 Если, к только, что записанным правилам добавить несколько фактов, определяющих мам и пап, то получается база знаний, которая называется "семья":





мама(Саша,Петя);

папа(Сережа,Петя);

мама(Оля,Саша);

папа(Коля,Саша);

мама(Люда,Сережа);

папа(Петя,Сережа);

родитель(x,y)<-мама(x,y);

родитель(x,y)<-папа(x,y);

бабушка(x,y)<-мама(x,z),родитель(z,y);

дедушка(x,y)<-папа(x,z),родитель(z,y);.



 В данном примере для определения понятия родитель(x,y) потребовалось более одного правила. По сути дела здесь использовано недетерминированное ветвление, дающее альтернативное определение этого отношения и используемое системой после того, как было применено первое отношение. Следует подчеркнуть, что в определении участвуют оба правила. В общем случае число правил не ограничено.



































































Арифметика и другие встроенные предикаты в Прологе-Д.



  Системы логического программирования, к числу которых относится и Пролог-Д, не предназначены для вычислений. Традиционный для Пролога-Д подход при выполнении арифметических действий описан в упражнении 5 из предыдущего раздела. Однако для определения таким образом всех математических действий памяти компьютера будет недостаточно. Поэтому традиционные действия, связанные с выполнением арифметических операций осуществляются посредством специальных встроенных предикатов. В системе Пролог-Д для выполнения арифметических действий предусмотрен один встроенный арифметический предикат: УМНОЖЕНИЕ(Арг1,Арг2,Арг3,Арг4) Встроенный предикат УМНОЖЕНИЕ имеет четыре аргумента: целых, переменных, конкретизированных целыми, не конкретизированных переменных, допускает обратимость всех аргументов, однако, он может быть использован только в качестве цели в предложении. Предикат УМНОЖЕНИЕ предусматривает реализацию формулы: Арг1*Арг2+Арг3=Арг4.

  Предикат предусматривает обратимость аргументов и полностью покрывает арифметические операции в области целых чисел, предусмотренных синтаксисом входного языка ( -32767 <число> 32767). Следующая база знаний на языке Пролог-Д показывает, что с помощью данного предиката можно описать любые арифметические операции:



СЛОЖЕНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(1,X,Y,Z);

ВЫЧИТАНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(1,X,Z,Y);

УМНОЖЕНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(X,Y,0,Z);

ДЕЛЕНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(Y,Z,0,X);



  Во всех четырех случаях X,Y - суть операнды операций, а Z - результат. Например, СЛОЖЕНИЕ(X,Y,Z) реализует арифметическую операцию сложение: Z=X+Y. Более подробное описание синтаксиса встроенного предиката УМНОЖЕНИЕ приведено в описании синтаксиса. Предикат УМНОЖЕНИЕ позволяет описывать вычислительные задачи.

  Пример 1. На Прологе-Д необходимо описать вычисление площади прямоугольника, имеющего стороны длиной a и b. Известна формула определяющая площадь прямоугольника Sпр. Sпр=a*b.

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



УМНОЖЕНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(X,Y,0,Z);

площадь(a,b,S)<-УМНОЖЕНИЕ(a,b,S);.



 Первый предикат УМНОЖЕНИЕ потребовалось определить для наглядности записи. Необходимо отметить, что предикат площадь обратим, это означает, что, пользуясь этим описанием можно вычислить не только площадь по заданным сторонам, но и любую (одну) сторону по другой стороне и площади. К базе знаний можно задать вопросы:



?площадь(10,20,S);



ответ системы Пролог-Д: S=200,



?площадь(a,20,100);



ответ системы Пролог-Д: a = 5. Более сложная задача представлена в нижеследующем примере.

  Пример 2. На Прологе-Д необходимо описать вычисление объема параллелепипеда высотой h, в основании которого прямоугольник, имеющий стороны длиной a и b. Известна формула определяющая объема параллелепипеда Vпар. Vпар=a*b*h. Предикат, который будет выполнен, если будет вычислен объем параллелепипеда должен иметь четыре аргумента - длины сторон a, b, высоту h и величину объема. Имя предиката должно отражать его назначение, вероятно, этому критерию удовлетворит имя объем:



УМНОЖЕНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(X,Y,0,Z);

объем(a,b,h,V)<-УМНОЖЕНИЕ(a,b,S), УМНОЖЕНИЕ (S, h, V);



  Как и прежде предикат объем обратим, это означает, что, используя это описание можно вычислить, не только объем по заданным сторонам и высоте, но и любую (одну) сторону или высоту по высоте, стороне и объему. В качестве альтернативы, можно иначе записать объем, если воспользоваться формулой: 



Vпар=Sосн*h.



  Эту базу знаний предлагается написать самостоятельно.

  К базе знаний можно задать вопросы:



?объем(10,20,5,V);



 ответ системы Пролог-Д: V=200. Наряду с арифметическим предикатом существуют два предиката БОЛЬШЕ и НЕ. Встроенный предикат БОЛЬШЕ(Арг1,Арг2) предназначен для сравнения двух целых или переменных. Он имеет два аргумента: целых или переменных, конкретизированных целыми. Оба аргумента к моменту выполнения должны быть определены. Если эти требования не выполнены, то появится сообщение об ошибке: "Функция не может быть выполнена.". Предикат выполнен, если Арг1 > Арг2, иначе - не выполнен. Несмотря на то, что предикат БОЛЬШЕ один, его достаточно для описания всех возможных предикатов для сравнения числовой информации: равенство - РАВНО; меньше - МЕНЬШЕ; меньше и равно - МИР и так далее. Это показывает база знаний, приведенная ниже:



РАВНО(X,X);

МЕНЬШЕ(X,Y)<-БОЛЬШЕ(Y,X);

МИР(X,Y)<-НЕ(БОЛЬШЕ(X,Y);



  В последнем предложении использован встроенный предикат НЕ, его синтаксис: НЕ(Арг1); Этот встроенный предикат имеет один аргумент, он обязательно должен быть предикатом. Предикат НЕ выполнен тогда и только тогда, когда предикат - аргумент не выполнен. А теперь несложный пример, иллюстрирующий применение БОЛЬШЕ и НЕ. 

Пример 3. Опишите на языке Пролог-Д вычисление функции Хевисайда, определяемую формулой:



				 0, если x<0;

	h(x)	=		 0, если x=0;

				 1, если x>0.



   База знаний должна содержать описание предиката меньше и равно, который выше уже был описаны, предикат, выполняющийся при вычислении функции Хевисайда, будет называться ХЕВИСАЙД. Этот предикат будет иметь два аргумента, первый это аргумент функции, а второй ее значение. Предикат ХЕВИСАЙД определяется через два альтернативных описания для всех значений x



МИР(X,Y)<-НЕ(БОЛЬШЕ(X,Y);

ХЕВИСАЙД(X,0)<-МИР(X,0);

ХЕВИСАЙД(X,1)<-БОЛЬШЕ(X,0);



 К этой базе знаний можно задать различные вопросы.



?ХЕВИСАЙД(20,X);



ответ системы Пролог-Д: X=1. И, наконец, последний встроенный предикат - это предикат - "отсечение", предназначенный для управления логическим выводом. Этот предикат потребуется для решения следующих проблем:

1. Ограничение количества найденных решений. 

2. Нахождение некоторого особенного решения задачи.

3. Ограничение объема поиска, с целью повышения эффективности работы компьютера. Предикат "отсечение" обозначается знаком восклицания - (!).

  Необходимо отметить, что это традиционное обозначение отсечения в системах логического программирования. Если данный предикат использовать в качестве цели в предложении, то полученный при этом эффект можно проиллюстрировать дверью, через которую можно пройти только слева направо, но нельзя вернуться назад через эту дверь. Роль двери выполняет символ !. Как известно система Пролог-Д будет пытаться выполнять цели в предложении порядке просмотра слева направо, начиная от символа <- от первой до последней цели. Если какая-либо цель оказывается не выполненной, то осуществляется возврат и делается попытка найти альтернативные решения. Отсечение ограничивает возможность поиска альтернатив с того момента, как была просмотрена цель, обозначенная символом !. По этой причине, если не выполнены цели А,Б,В, возврат для нахождения альтернативных решений в предложении пример<-А,Б,В,!,Г,Д,Е; возможен, а, если не выполнены цели Г,Д или Е, то уже нет. Рубикон при движении слева направо перейден. Необходимо отметить важность этого предиката особенно при описании задач, допускающих множественные решения. Иллюстрация предиката отсечение на примере базы знаний мама. Действительно, у каждого человека не может быть две матери, поэтому, определив для данного человека имя матери, необходимо прекратить дальнейшие поиски.



мама(Саша,Петя)<-!;

мама(Наташа,Ваня)<-!;

мама(Оля,Петя)<-!;

мама(Катя,Даша)<-!;

мама(Люда,Сережа)<-!;

мама(Петя,Костя)<-!;



к базе знаний может быть задан вопрос



?мама(x,Даша); ответ системы Пролог-Д:



x=Kатя ДРУГИХ РЕШЕНИЙ НЕТ.



  После нахождения первого решения поиск альтернатив не производится.





























5. Рекурсия.



  Существует огромное количество задач, в которых отношения между объектами можно определить, только используя сами определяемые соотношения. При этом получаются правила, называемые рекурсивными. Применение рекурсии для описания задач при работе с системами логического программирования широко распространенный прием. Рекурсия будет проиллюстрирована несколькими примерами построения программ, как вычислительных, так и логических. Первым примером будет пример вычисления наибольшего общего делителя (НОД) двух чисел. Предикат, который выполняется, если найден НОД двух данных чисел будет иметь имя нод и три аргумента: числа a,b и значение НОД - c. Для описания вычисления НОД используются следующие соображения. Во-первых, если, а=b, то c=a=b; Во-вторых, если, а>b, то необходимо вычислить НОД для чисел b и a-b; В-третьих, если b>a, то необходимо вычислить НОД для чисел a и b-a. Эти три утверждения естественным образом могут быть записаны на Прологе-Д.:

нод(а,а,а);



нод(а,b,c)<-БОЛЬШЕ(а,b),ВЫЧИТАНИЕ(a,b,d),нод(b,d,c);



нод(а,b,c)<-БОЛЬШЕ(b,а),ВЫЧИТАНИЕ(b,a,d),нод(a,d,c);

ВЫЧИТАНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(1,X,Z,Y);



Если к этой базе знаний задать вопрос:



?нод(10,15,x);



ответ системы Пролог-Д:



x=5 ДРУГИХ РЕШЕНИЙ НЕТ



 Предикат нод, определенный выше оказывается обратимым. В качестве второго примера рассматривается задача о вычислении элементов последовательности: 0, 1, 1, 2, 3, 5, 8, 13, 21 ,34, 55, 89, 144,... , известной как последовательность Фибоначчи. Каждый элемент ее определяется следующими правилами:



f0 =0,

f1 =1,

fn =fn-1+fn-2, при n>1



  Первая формула соответствует утверждению о том, что значение нулевого элемента последовательности равно нулю. Это можно записать в виде факта: Фиб(0,0);. Вторая строка соответствует утверждению: первый элемент равен 1. На Прологе-Д это можно записать так: Фиб(1,1);. Третья строка представляет собой запись рекурсивного соотношения: 



Фиб(N,X)<-БОЛЬШЕ(N,1),ВЫЧИТАНИЕ(N,1,М),

ВЫЧИТАНИЕ(N,2,К), Фиб(М,Y), Фиб(K,Z),

СЛОЖЕНИЕ(Y,Z,X);



 ВЫЧИТАНИЕ и СЛОЖЕНИЕ - имена предикатов вычитание и сложение, определяемых с помощью правил: 



СЛОЖЕНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(1,X,Y,Z);

ВЫЧИТАНИЕ(X,Y,Z)<-УМНОЖЕНИЕ(1,X,Z,Y);.



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



?Фиб(10,X);



ответ системы Пролог-Д:



x=55 ДРУГИХ РЕШЕНИЙ НЕТ



  Необходимо сказать, что такой путь решения данной задачи не самый лучший. Для нахождения N+1 числа Фибоначчи требуется 2* (N+1)-1 рекурсивное обращение. Однако этого можно избежать, если перейти к другой базе знаний, в которой предикат с именем "Фиб" определен как трехарный, то есть имеющий три аргумента, включающий в себя в качестве аргумента значения N-ого и N-1- ого элементов последовательности. Такая база знаний получается в результате перевода на язык Пролог-Д утверждений.

1. 0-ой элемент последовательности есть 0, а (-1) -ый элемент не определен. Фиб(0,x,0);.

 Второй аргумент обозначен x. В данном случае значение x может быть любым.

2. 1-й элемент последовательности есть 1, а нулевой-0. Фиб(1,0,1);. 3. N -й член последовательности Фибоначчи определяется через (N-1) -Й член последовательности. 



Фиб(N,F,f)<-БОЛЬШЕ(N,1),ВЫЧИТАНИЕ(N,1,M),Фиб (M,Ф,F), СЛОЖЕНИЕ (Ф, F, f);.



Обращение к этой базе знаний будет иметь вид:



?Фиб(10,F,f);.



ответ системы Пролог-Д:



F=55, f=34 ДРУГИХ РЕШЕНИЙ НЕТ



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



родитель(X)<- родитель(Y),отец(Y,Z);

родитель(Коля);

отец(Коля, Петя);

родитель(Петя);



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



родитель(Коля);

родитель(X)<-родитель(Y), отец(Y,X);

отец(Коля, Петя);

?родитель(Петя);.

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



ВЫШЕ(А,В)<-НИЖЕ(В,А);

НИЖЕ(В,А)<-ВЫШЕ(А,В);

ВЫШЕ(Коля, Петя);

?НИЖЕ(Петя, Коля);.



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



?Фиб(0,x,y);,



то первый возможный результат x =_0, y =1. Далее в попытке отыскать следующее решение возникает бесконечная петля, так как будет отыскиваться Фиб(-1,x,y), Фиб(-2,...),... . Для контроля за подобной ситуацией необходима модификация базы знаний. Первые два предложения должны быть записаны в виде:



Фиб(0,x,1)<-!;

Фиб(1,1,1)<-!;,



тогда при поиске альтернативного решения после получения ответа на вопрос:



?Фиб(0,x,y); x=_0, y =1



будет получен результат:



ДРУГИХ РЕШЕНИЙ НЕТ.



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



1.					2.

мама(Таня, Надя); 			мама(Таня, Надя);

бабушка(X,Y)<-мама(X,Z),		мама(Надя, Катя);

мама(Z,Y),					бабушка(X,Y)<-мама(X,Z),

мама(Надя, Катя);			мама(Z,Y);. 









































6. Графические возможности системы Пролог-Д.



	 Когда речь идет о компьютерной графике, построение изображения на экране интерпретируется серией команд. Таким образом, всякое изображение ассоциируется с алгоритмом его построения. Однако, эта концепция не укладывается в принципы декларативного программирования, принятые в системе Пролог-Д. Если последовать этой концепции то необходимым становится описание элементов рисунка в виде совокупности графических объектов, соотношений и связей между ними. В этом случае описание последовательности действий художника - исполнителя становится излишним. В системе Пролог-Д определен набор графических примитивов, отображающих графические объекты и построенных таким образом, что с точки зрения синтаксиса каждый из них может быть только целью, и принимает значение "истина" (выполняется), если на экране появляется графическое изображение объекта. При записи в правиле нескольких графических примитивов и выполнении данного правила на экране появляется объединение графических образов в той последовательности, как они описаны в правиле. Во всех графических встроенных предикатах аргументами должны быть целыми или переменными, конкретизированными целыми, или не конкретизированными переменными. Если это требование не выполнено, то появится сообщение об ошибке. Параметр v - вертикальный размер, а h - горизонтальный размер экрана. Для стандартной платы видеоадаптера VGA v=349, h=639. В предикатах ТОЧКА, ЛИНИЯ, ОКРУЖНОСТЬ, ЗАКРАСКА последний параметр задает цвет. Как правило, если на этом месте стоит не конкретизированная переменная, то также выводится сообщение об ошибке. Для обозначения цвета при использовании видеоадаптера VGA принята кодировка цветов, изображенная в таблице 3.4.1. В системе Пролог-Д имеет место особенность использования встроенных предикатов, обусловленная спецификой графических средств системы IBM-PC. Для использования графики необходимо открыть графический файл с помощью предиката ЗАПИСЬ_В(“grp:”). После завершения работы необходимо открыть файл для вывода текста ЗАПИСЬ_В(“con:”).



0

черный

8

темно серый

1

синий

9

светло синий

2

зеленый

10

светло зеленый

3

голубой

11

светло голубой

4

коричневый

12

красный

5

фиолетовый

13

сиреневый

6

темно желтый

14

желтый

7 

серый

15

белый



Таблица 1. Таблица кодирования цвета в системе Пролог-Д.



 В системе Пролог-Д предусмотрены следующие встроенные графические предикаты:

1. ТОЧКА.

Синтаксис: ТОЧКА(Арг1,Арг2,Арг3)

Встроенный предикат ТОЧКА имеет три аргумента. Ниже приведены результаты выполнения в зависимости от типа аргумента.

ТОЧКА(ц1,ц2,ц3) Установить точку с координатами (ц1,ц2) и цветом ц3;

ТОЧКА(ц1,ц2,П3) П3 := цвет_точки(ц1,ц2);

ТОЧКА(ц1,П2,ц3) Рисовать линию с начальной точкой (ц1,0), конечной - (ц1,211) цветом ц3;

ТОЧКА(П1,ц2,ц3) Рисовать линию с начальной точкой (0,ц2), конечной - (255,ц2) цветом ц3;

ТОЧКА(П1,П2,ц3) Заполнить экран цветом ц3. В этих пяти случаях предикат истинен, иначе - выполнение программы прекращается и выводится сообщение об ошибке: "Невыполнимый предикат ТОЧКА".



2. ЛИНИЯ.

Синтаксис: ЛИНИЯ(Арг1,Арг2,Арг3,Арг4,Арг5).

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

ЛИНИЯ(ц1,ц2,ц3,ц4,ц) Рисовать линию с начальной точкой (ц1,ц2), конечной - (ц3,ц4), цветом ц

ЛИНИЯ(ц1,ц2,ц3,П4,ц) Рисовать закрашенный треугольник с вершинами (ц1,ц2), (ц3,0), (ц3,211) и цветом ц;

ЛИНИЯ(ц1,ц2,П3,ц4,ц) Рисовать закрашенный треугольник с вершинами (ц1,ц2), (0,ц4), (255,ц4) и цветом ц;

ЛИНИЯ(ц1,П2,ц3,ц4,ц) Рисовать закрашенный треугольник с вершинами (ц1,0), (ц1,211), (ц3,ц4) и цветом ц;

ЛИНИЯ(П1,ц2,ц3,ц4,ц) Рисовать закрашенный треугольник с вершинами (0,ц2), (255,ц3), (ц3,ц4) и цветом ц;

ЛИНИЯ(П1,П2,ц3,ц4,ц) | ЛИНИЯ(ц1,ц2,П3,П4,ц) |

ЛИНИЯ(ц1,П2,П3,П4,ц) | ЛИНИЯ(П1,ц2,П3,П4,ц) - Заполнение экрана цветом ц

ЛИНИЯ(П1,П2,ц3,П4,ц) | ЛИНИЯ(П1,П2,П3,ц4,ц) |

ЛИНИЯ(П1,П2,П3,П4,ц) | ЛИНИЯ(ц1,П2,ц3,П4,ц) - Вертикальный, закрашенный цветом ц прямоугольник, с вершинами (ц1,0), (ц1,211), (ц2,0), (ц2,211);

ЛИНИЯ(П1,ц2,П3,ц4,ц) Горизонтальный закрашенный цветом ц прямоугольник с вершинами (0,ц2), (255,ц2), (0,ц4), (255,ц4);

ЛИНИЯ(ц1,П2,П3,ц4,ц) Четырехугольник цветом ц с вершинами (ц1,0), (ц1,211), (0,ц4), (255,ц4);

ЛИНИЯ(П1,ц2,ц3,П4,ц) Четырехугольник цветом ц с вершинами (0,ц2), (255,ц2), (ц3,0), (ц3,211).

  В этих шестнадцати случаях предикат истинен, иначе выполнение программы прекращается и выдается сообщение об ошибке.



3. ОКРУЖНОСТЬ.

Синтаксис: ОКРУЖНОСТЬ(Арг1,Арг2,Арг3,Арг4).

  Встроенный предикат ОКРУЖНОСТЬ имеет четыре аргумента. Четвертым аргументом всегда должно быть целое, арифметическое выражение или переменная, конкретизированная целым. Ниже приведены результаты выполнения в зависимости от типов аргументов.

ОКРУЖНОСТЬ(ц1,ц2,ц3,ц) Окружность с центром (ц1,ц2), радиусом ц3, цветом ц; 

ОКРУЖНОСТЬ(ц1,ц2,П3,ц) | ОКРУЖНОСТЬ(ц1,П2,П3,ц) |

ОКРУЖНОСТЬ(П1,ц2,П3,ц) Заполнение экрана цветом ц 

ОКРУЖНОСТЬ(П1,П2,П3,ц) | ОКРУЖНОСТЬ(П1,П2,ц3,ц) |

ОКРУЖНОСТЬ(ц1,П2,ц3,ц) Вертикальный закрашенный цветом ц прямоугольник с вершинами: (ц1-ц3,0), (ц1-ц3,211), (ц1+ц3,0), (ц1+ц3,211);

ОКРУЖНОСТЬ(П1,ц2,ц3,ц) Горизонтальный закрашенный цветом ц прямоугольник с вершинами: (0,ц2-ц3), (255,ц2-ц3), (0,ц2+ц3), (255,ц2+ц3); В этих восьми случаях предикат истинен, иначе выполнение программы прекращается и выводится сообщение об ошибке: "Невыполнимый предикат ОКРУЖНОСТЬ"

4. ЗАКРАСКА.

Синтаксис: ЗАКРАСКА(Арг1,Арг2,Арг3,Арг4). 

 Встроенный предикат ЗАКРАСКА имеет четыре аргумента. Процедурно этот предикат означает закрасить цветом Арг3 внутри контура с граничным цветом Арг4 начиная с точки (Арг1,Арг2). Предикат всегда истинен. Все аргументы должны быть целыми, арифметическими выражениями или переменными, конкретизированными целыми. Если это условие не выполняется, то выполнение программы прекращается и выводится сообщение об ошибке: "Невыполнимый предикат ЗАКРАСКА".

Пример: закрашенный квадрат 



рамка(x1',y1',x2',y2',цвет')<-ЛИНИЯ(x1',y1',x1',y2',цвет');

ЛИНИЯ(x1',y1',x2',y1',цвет');ЛИНИЯ(x1',y2',x2',y2',цвет');

ЛИНИЯ(x2',y1',x2',y2',цвет');

пример <- рамка(50,50,150,150,8),ЗАКРАСКА(100,100,15,8); 

?пример;.



 В качестве примера приводится описание угла, вершина которого находится в точке (x,y):

угол(x,y)<-ЛИНИЯ(x,y,10,10,1),ЛИНИЯ(x,y,150,50,1); 

?угол(100,100);.

 Сначала будет нарисован отрезок, соединяющий точки (100,100) и (10,10), а затем отрезок, соединяющий точки (100,100) и (50,50). Если бы пятым аргументом предикатов ЛИНИЯ было бы число равное нулю, то точки отрезков были бы не видимы. Не обязательно, чтобы описание всей картинки было записано в одном предложении. Часть описания может быть выделена в виде отдельного предложения. Программу предыдущего примера можно модифицировать:

угол(x,y)<-ЛИНИЯ(x,y,10,10,1),продолжение(x,y);

продолжение(x,y)<-ЛИНИЯ(x,y,50,50,1); ?угол(100,100);.

  Новая программа будет выполнять те же самые функции, хотя и записывается в два предложения. Система Пролог -Д допускает возможность использования переменных в графических примитивах. В качестве примера приводится описание вектора, выходящего из точки A с кoординатами (x, y) в точку B координатами (s,t): 



вектор(A(x,y),B(s,t))<-ЛИНИЯ(x,y,s,t,1); 



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

В качестве примера приводится вопрос: 



?ЛИНИЯ(0,0,x,0,1);.

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



квадр(x,y,z,t)<-ЛИНИЯ(x,y,x,t,1),ЛИНИЯ(x,y,z,y,1),

ЛИНИЯ(x,t,z,t,1), ЛИНИЯ(z,y,z,t,1);.

















7. Обработка списков



 На практике часто встречаются задачи, связанные с перечислением объектов. Для описания таких объектов используются списки. Например, список учеников первого класса: [Саша,Петя,Дима,Ксюша,Лена,Оля,Катя].

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



[Челябинск(0),Миасс(2),Златоуст(5),Вязовая(5),Усть-Катав(2), Аша(2), Уфа(20),Абдулино(3),Самара(20),Сызрань(2),Инза(2),

Рузаевка(10), Потьма(2), Рязань(5), Москва(0)].



 Примером списка, состоящего из списков, может служить прямоугольная таблица (матрица), представляющая собой список строк, каждая из которых список элементов в данной строке. Например, таблица: 23 45 56 2 78 89 66 45 56 12 3 75 2 3 6 5  2 1 56 2 5 8 9 22 23 22 33 5 6 9 1 33 может быть представлена следующим списком, состоящим из списков: 

 [[23,45,56,2,78,89,66,45],[56,12,3,75,2,3,6,5],

[2,1,56,2,5,8,9,22],[2,1,56,2,5,8,9,22],[23,22,33,5,6,9,1,33]].



 Во всех примерах квадратные скобки означают, что данный объект представляет собой список. Список может быть определен двумя способами: перечислением элементов списка, то есть так, как это было сделано выше и определением головы и хвоста списка. Например, список [X|Y] определен именно таким путем. X - это голова списка, а Y - его хвост. Различные шаблоны определяют различное внутреннее представление.

Шаблону [x,y] соответствует внутреннее представление

СПИСОК

/       \

		x	СПИСОК

				/ \

				y     [ ]



Шаблону [x|y] соответствует внутреннее представление:



СПИСОК

/   \

x       y



  Разные шаблоны - разные внутренние представления - обуславливают различия в унификации. Используя представление списка можно решить ряд задач.



Решение

Задача 1.1.2



1.1.2. Опишите на языке логики первого порядка свойства отношения равенство.





Задача 2.1.2



2.1.2. Опишите на языке Пролог-Д состав своей семьи. 



Я опишу некоторую,  придуманную мной семью, состоящую из мамы, папы, дедушки (отца мамы) и бабушки. Родственные отношения описываются предикатами МАМА, ПАПА, ДЕДУШКА, БАБУШКА.





Ниже приведен текст программы (файл v8_212.prw)



%2.1.2. 

МАМА(Оля,Петя);

ПАПА(Сергей,Катя);

МАМА(Лена,Сергей);

ПАПА(Толя,Оля);

БАБУШКА(X,Y)<-МАМА(X,Z),МАМА(Z,Y);

БАБУШКА(X,Y)<-МАМА(X,Z),ПАПА(Z,Y);

ДЕДУШКА(X,Y)<-ПАПА(X,Z),ПАПА(Z,Y);

ДЕДУШКА(X,Y)<-ПАПА(X,Z),МАМА(Z,Y);





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

Приведем примеры запросов:



? ДЕДУШКА(X,Петя);

? МАМА(X,Y);



Результат работы программы:



	X=Коля

	

	X=Оля

	Y=Катя

	

	X=Лена

	Y=Сергей



Задача 2.2.4



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

          x, если x <-1,

F(x)=	 x+1, если -1<x<1,

	x, если x >1.



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



Ниже приведен текст программы (файл v8_224.prw)



%2.2.4



ЗНАЧЕНИЕ(X,F)<-МЕНЬШЕ(X,-1),РАВНО(-1,F);

ЗНАЧЕНИЕ(X,F)<-МЕНЬШЕ(-1,X),МЕНЬШЕ(X,1),СЛОЖЕНИЕ(X,1,F);

ЗНАЧЕНИЕ(X,F)<-МЕНЬШЕ(1,X),РАВНО(X,F);



Приведем примеры запросов:



%Примеры вычислений

?ЗНАЧЕНИЕ(2,F);

?ЗНАЧЕНИЕ(-3,F);

?ЗНАЧЕНИЕ(0.2,F);



Результат работы программы:

F=2



F=-1



F=1.2



Нетрудно убедиться, что вычисления выполненны верно.

Чтобы работать с программой необходимо делать запросы: ЗНАЧЕНИЕ(аргумент,F);

После выполнения запроса в F будет содержатся значение вычисленного выражения.



Задача 2.2.5



2.2.5. Какие сложности могут возникнуть в базе знаний о мамах, если у двух мам дети будут тезками? Напишите программу на Прологе-Д, которая находит имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.



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

Разрабатываемая программа предназначенна для того, чтобы определять имена матерей по именам их детей.



Ниже приведен текст программы (файл v8_225.prw)



%2.2.5. 

%База мам и детей

МАМА(1,Наташа,Катя);

МАМА(2,Саша,Петя);

МАМА(3,Света,Ваня);

МАМА(4,Лена,Катя);



Пример запроса в ситуации, когда у матерей дети – тезки



%Какие сложности могут возникнуть в базе знаний о мамах, если у двух мам дети будут тезками? 

? МАМА(_,X,Катя);



X=Наташа



X=Лена



Итак, для ребенка мы получили 2-х матерей.



Следующая часть задания:



%Поиск имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.

? МАМА(2,X,Петя),РАВНО(X,Саша),НЕ(РАВНО(X,Оля));





Результат работы:



X=Саша



Итак, мы определили имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.





Задача 2.3.2



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



Разрабатываемая программа предназначена для вычисления суммы ряда натуральных чисел. Для выполнения задания воспользуемся следующим рекурсивным определением искомой cуммы:

1)S(0)=0

2)S(n)=n+S(n-1)



Ниже приведен текст программы (файл v8_232.prw)



%2.3.2. 



%унификация вычисленного значения с выходной переменной

Сумма(0,S,S);



%рекурсивный вызов процедуры поиска суммы    пока N>0

Сумма(N,P,S)<-СЛОЖЕНИЕ(N,P,L),СЛОЖЕНИЕ(M,1,N),Сумма(M,L,S),!;



Пример использования программы:



%пример вызова предиката

? Сумма(10,S);



Результат:

S=55



Несложная проверка показывает правильность произведенных вычислениий.

Для использования программы, надо вызывать предикат Сумма(X,S), подставляя вместо X число,  до которого надо найти сумму.



Задача 2.3.1



2.3.1. Написать на языке Пролог-Д базу знаний, описывающую вычисление факториала.



Программа предназначенна для вычисления факториала числа n!=1*2*3…*n.



Воспользуемся следующим рекурсивным определением факториала:

1)0!=1

2)n!=n*(n-1)!

Итак, будем рекурсивно вызывать факториал, пока аргумент не станет равным – 0. 

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



Ниже приведен текст программы (файл v8_231.prw)



%2.3.1. 



Факториал(N,F)<-Факториал(N,1,F);



%унификация вычисленного значения с выходной переменной

Факториал(0,F,F);



%рекурсивный вызов процедуры вычисления факториала, N*(N-1)*(N-2).....2*1    пока N>0

Факториал(N,P,F)<-УМНОЖЕНИЕ(N,P,S),СЛОЖЕНИЕ(M,1,N),Факториал(M,S,F),!;



Пример использования программы:

%пример вызова предиката

? Факториал(5,F);



Результат:

F=120



Несложная проверка показывает правильность произведенных вычислениий.

Для использования программы, надо вызывать предикат Факториал(X,F), подставляя вместо X число,  факториал которого надо найти . Следует учесть, что факториал растет очень быстро и не задавать больших значений аргумента.

Задача 2.4.1



2.4.1. Напишите на языке Пролог-Д базу знаний, описывающую прямоугольный треугольник.



Разрабатываемая программа предназначена для рисования прямоугольного треугольника по его катетам.  Задача заключается в том, чтобы по катетам найти координаты вершин и соединить их прямыми линиями.



Ниже приведен текст программы (файл v8_241.prw)



%2.4.1. 

%рисуем прямоугольный треугольник с катетами a и b



ПрямоугТреуг(a,b)<-ЗАПИСЬ_В("grp:"),СЛОЖЕНИЕ(10,a,c),СЛОЖЕНИЕ(10,b,d),

ЛИНИЯ(10,10,c,10,1),ЛИНИЯ(c,10,10,d,1),ЛИНИЯ(10,d,10,10,1);



Пример использования программы:



%Пример

 ? ПрямоугТреуг(100,150);



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



Результат выполнения примера:











Задача 2.5.4



2.5.4. Напишите базу знаний, описывающую удаление n-oго элемента списка



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

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



Ниже приведен текст программы (файл v8_254.prw)



% 2.5.4

%Предикат удаления N-ого символа из списка L и помещение результата в список S

%Первый вызов DELNEL(L,N,1,[],Z) - удаляет символ и записывает результат в обратном порядке

% второй вызов DELNEL(L,0,1,[],S) - обращает обратно

DELNEL(L,N,S)<-DELNEL(L,N,1,[],Z),DELNEL(Z,0,1,[],S);



DELNEL([],_,_,S,S);

%если не N-ный символ

DELNEL([X|T],N,I,Y,S)<- НЕ(РАВНО(N,I)),ДОБАВИТЬ(X,Y,Z),СЛОЖЕНИЕ(1,I,J),DELNEL(T,N,J,Z,S);

%если  N-ный символ

DELNEL([X|T],N,I,Y,S)<-РАВНО(N,I),СЛОЖЕНИЕ(I,1,J),DELNEL(T,N,J,Y,S);



%добавление элемента X в начало списка Y

ДОБАВИТЬ(X,Y,[X|Y]);



Пример использования программы, удалим 3-й элемент из списка:



%пример работы. 

? DELNEL([1,8,9,7,5],3,S);                                                                                                                                                                                                                                                                                                                                                                                                   





Результат выполнения примера:

S=[1,8,7,5]



Для того, чтобы удалить элемент из списка необходимо вызвать предикат DELNEL, задав в качестве параметров, список, номер удаляемого элемента и имя результирующего списка.      



























Список литературы



Абдикеев Н.М. Проектирование интеллектуальных систем в экономике. Учебник / М.: Экзамен, 2004 – 526с.

 Алексеев М.Н., Бешенков С.А., Гейн А.Г., Григорьев С.Г. Информатика и информационные технологии: практические работы / Миасс, 2000 - 42 с.

Бешенков С.А., Гейн А.Г., Григорьев С.Г. Информатика и информационные технологии. Екатеринбург: Уральский рабочий, 1995 - 134 с.

Бешенков С.А. Школьная информатика: новый взгляд, новый     курс// Педагогическая информатика. N2. 1993 с. 5-10

Гаврилова Т.А., Хорошевский В.Ф., Базы знаний       интеллектуальных систем. Учебник/ Санкт-Петербург:Питер, 2000- 382 с.

Григорьев С.Г., Морозова Е.В. Информатика и информационные технологии: Сборник задач / ЛБЛ-Балтика. Санкт-Петербург, 1996 – 32 с.