WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 2 | 3 || 5 |

Для поиска подстрок и отдельных символов используются предикаты Игрушечная ЭС «Кто чем увлекается» searchstring(SourceStr,SearchStr,Position) и Мы хотим создать систему, которая отвечала бы на вопросы, seachchar(SourceString,Char,FoundPos) сформулированные на русском языке, на тему увлечений (hobby) соответственно. Они возвращают позиции начала подстроки и действующих лиц.

символа.

Начнем с простейшего варианта.

Для выбора подстроки используется предикат subВ простейшем варианте нам следует создать элементарную string(STRING,Pos,Len,SubStr), базу фактов типа увлечение (Кто,Что). Все вербальные варианты для выбора символа – предикат запросов система проинтерпретирует так:

subchar(String,Position,RetChar).

1) если в тексте вопроса присутствует значение "Кто" (ПетДлина строки определяется предикатом str_len.

ров, Сидоров,...), следует выдать все значения "Что";

2) если в тексте вопроса присутствует значение "Что", следует выдать все значения "Кто";

3) если в тексте запроса присутствуют "Что" и "Кто", то система интерпретирует запрос, как "Увлекается ли Кто Что".

Ответ: "Да" или "Нет" в зависимости от содержания элементарной базы знаний.

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

Алгоритм обработки запросов очень прост. В самом сложном случае, когда их типы заранее не определены (через меню выбора типа), каждое слово запроса проверяется на принадлежность типам "Кто" или "Что", и, в зависимости от результата, формулируется ответ. "Закодируем" алгоритм обработки строки-запроса Запрос, полагая, что база знаний содержится в файле "hobbyNew.dbs".

Программа завершает работу, если в ответ на ее вопрос write("Есть вопросы (Д|Н|д|н)") пользователь ответит 'Н' или 'н'.

39 Предикат repeat используется в разделе goal для организации цик- write("Нет");

ла по обработке вопросов.

domains кто(Кто), кто=symbol not(что(_)),!, что=symbol write(Кто,".Хобби:"),nl, facts – f1 ответить_что(Кто);

увлечение(кто,что) кто(кто) что(Что), что(что) not(кто(_)),!, predicates write(Что," является увлечением для:"),nl, nondeterm repeat ответить_кто(Что);

nondeterm ответить(symbol) ответить_что(кто) !,write("Не понял"),nl.

ответить_кто(что) анализ_КтоЧто(symbol) ответить(Запрос):- спросить fronttoken(Запрос,Лексема,Остаток),!, goal анализ_КтоЧто(Лексема), consult("hobbyNew.dbs",f1), ответить(Остаток).

repeat, анализ_КтоЧто(Лексема):- спросить, увлечение(Лексема,_),!, assert(кто(Лексема));

retractall(кто(_)), увлечение(_,Лексема),!, assert(что(Лексема));

retractall(что(_)), !.

write("Есть вопросы (Д|Н)"), ответить_кто(Что):- readchar(ДаНет), увлечение(Кто,Что), ДаНет='Н',exit(). write(Кто),nl, clauses fail.

repeat. ответить_кто(_).

repeat:-repeat. ответить_что(Кто):- ответить(""):- увлечение(Кто,Что), кто(Кто), write(Что),nl, что(Что), fail.

увлечение(Кто,Что),!, ответить_что(_).

write("Да"); спросить:- write("Введите Ваш вопрос:"),nl, кто(Кто), readln(Вопрос), что(Что), ответить(Вопрос),!;

not(увлечение(Кто,Что)),!, !.

41 Теперь усложним задачу с целью дать возможность пользо- Текст программы.

вателю формулировать вопрос грамматически правильно, а также domains для того, чтобы вводить любые виды отношений. Факты мы при- список=symbol* ведем к универсальному виду f(объект1,отношение,объект2), а facts – fтакже введем синонимы для имен объектов и отношений. В дан- ф(symbol,symbol,symbol) ном случае под термином синоним будем понимать как граммати- соб(symbol,список) ческое видоизменение слова, так и другое слово, которое мы счи- сот(symbol,список) таем семантически эквивалентным исходному. кто(symbol) При данной организации БЗ и приведенном ниже алгоритме что(symbol) обработки запроса имена объектов и отношений, множества сино- отн(symbol) нимов различных отношений и множество синонимов различных временно(symbol) объектов не должны пересекаться. Например, если есть факты predicates ф("кирилл","хобби","шахматы")}, nondeterm repeat ф("кирилл","любить","татьяна")}, nondeterm ответить(symbol) соб("татьяна",["татьяну",...]) ответ1(symbol,symbol,symbol) сот("хобби",["нравится","увлекается","любит","любить"]) ответ2(symbol,symbol) сот("любить",["любит"]), ответ3(symbol,symbol) то на вопрос: "кирилл любит татьяну" вы получите ответ ответ4(symbol) "Нет!", поскольку в качестве имени отношения будет выбрано ответ5(symbol,symbol) "хобби". ответ6(symbol) Состав базы знаний. ответ7(symbol) ф("кирилл","хобби","хоккей") анализ_КтоОтношениеЧто(symbol) ф("петров","хобби","лыжи") nondeterm поиск_кто(symbol) ф("ирина","хобби","кино") nondeterm поиск_что(symbol) ф("татьяна","хобби","гимнастика") nondeterm поиск_отношения(symbol) ф("кирилл","хобби","гимнастика") искать_синоним_кто(symbol) ф("петров","любить","ирина") искать_синоним_отношения(symbol) ф("ирина","любить","кирилл") искать_синоним_что(symbol) ф("кирилл","любить","татьяна") загрузить_список(список) соб("кирилл",["кириллу","кириллом","кирилла","кирилле"]) спросить соб("петров",["петрову","петровым","петрова","петрове"]) goal соб("ирина",["ирине","ириной","ирины","ирину"]) consult("hobbyNew2.dbs",f1), соб("гимнастика",["гимнастикой","гимнастики","гимнастикой", repeat, "гимнастике","гимнастику"]) спросить, соб("татьяна",["татьяне","татьяной","татьяны","татьяну"]) retractall(кто(_)), сот("хобби",["нравится","увлекается"]) retractall(что(_)), сот("любить",["любит"]) retractall(отн(_)), 43 write("Есть вопросы (Д|Н)"), not(кто(_)), readchar(ДаНет), not(отн(_)), ДаНет='Н',!,exit().



что(Что),!, ответ7(Что);

clauses repeat.

!,write("Не понял"),nl.

repeat:-repeat.

ответить(Запрос):- ответить(""):- fronttoken(Запрос,Лексема,Остаток), кто(Кто), анализ_КтоОтношениеЧто(Лексема), что(Что), ответить(Остаток).

отн(Отношение),!, ответ1(Кто,Отношение,Что);

анализ_КтоОтношениеЧто(Лексема):- поиск_кто(Лексема),!;

кто(Кто), поиск_отношения(Лексема),!;

что(Что), поиск_что(Лексема),!;

not(отн(_)),ф(Кто,_,Что),!, !.

ответ2(Кто,Что);

поиск_кто(Лексема):- кто(Кто), not(кто(_)), отн(Отношение), ф(Лексема,_,_),!,assert(кто(Лексема));

not(что(_)),!, not(кто(_)),искать_синоним_кто(Лексема),!;!,fail.

ответ3(Кто,Отношение);

поиск_отношения(Лексема):- кто(Кто), not(отн(_)), not(отн(_)), ф(_,Лексема,_),!,assert(отн(Лексема));

not(что(_)),!, not(отн(_)),искать_синоним_отношения(Лексема),!;!,fail.

ответ4(Кто);

поиск_что(Лексема):- not(кто(_)), not(что(_)), отн(Отношение), ф(_,_,Лексема),!,assert(что(Лексема));

что(Что),!, not(что(_)),искать_синоним_что(Лексема),!;!,fail.

ответ5(Отношение,Что);

искать_синоним_кто(Лексема):- соб(Кто,СписокКто), not(кто(_)), загрузить_список(СписокКто), отн(Отношение), временно(Лексема),!, not(что(_)),!, retractall(временно(_)),assert(кто(Кто));

ответ6(Отношение);

45 fail. write("otvet3"),nl, искать_синоним_кто(_):-retractall(временно(_)),!,fail. write(Кто," ",Отношение," ",Что),nl, fail.

ответ3(_,_).

искать_синоним_отношения(Лексема):- сот(Отн,СписокОтн), ответ4(Кто):- загрузить_список(СписокОтн), ф(Кто,Отношение,Что), временно(Лексема),!, write("otvet4"),nl, retractall(временно(_)),assert(отн(Отн));

write(Кто," ",Отношение," ",Что),nl, fail.

fail.

искать_синоним_отношения(_):-retractall(временно(_)),!,fail.

ответ4(_).

искать_синоним_что(Лексема):- ответ5(Отношение,Что):- соб(Что,СписокЧто), ф(Кто,Отношение,Что), загрузить_список(СписокЧто), write("otvet5"),nl, временно(Лексема),!, write(Кто," ",Отношение," ",Что),nl, retractall(временно(_)),assert(что(Что));

fail.

fail.

ответ5(_,_).

искать_синоним_что(_):-retractall(временно(_)),!,fail.

ответ6(Отношение):- загрузить_список([]).

ф(Кто,Отношение,Что), загрузить_список([H|T]):- write("otvet6"),nl, assert(временно(H)),загрузить_список(T).

write(Кто," ",Отношение," ",Что),nl, fail.

ответ1(Кто,Отношение,Что):- ответ6(_).

ф(Кто,Отношение,Что),!, write("otvet1"),nl, ответ7(Что):- write("Да."),nl;!,write("Нет."),nl.

ф(Кто,Отношение,Что), write("otvet7"),nl, ответ2(Кто,Что):- write(Кто," ",Отношение," ",Что),nl, ф(Кто,Отношение,Что), fail.

write("otvet2"),nl, ответ7(_).

write(Кто," ",Отношение," ",Что),nl, спросить:- fail.

write("Введите Ваш вопрос:"),nl, ответ2(_,_).

readln(Вопрос), upper_lower(Вопрос,Q), ответ3(Кто,Отношение):- ответить(Q),!;

ф(Кто,Отношение,Что), !.

47 Протокол сеанса с системой (знак '' опущен, а также опу- otvetщены вопросы системы в отношении продолжения диалога): петров хобби лыжи Любит ли Кирилл Татьяну otvetotvet1 ирина хобби кино Да. otvet татьяна хобби гимнастика Любит ли Татьяна Кирилла otvetНет. кирилл хобби гимнастика В каких отношениях находятся Петров и Ирина Кто занимается гимнастикой otvet2 Есть вопросы (Д|Н)Введите Ваш вопрос:

петров любить Ирина (Комментарий: в синонимах нет слова гимнастикой) Кого любит Ирина otvetирина любить кирилл Как относится Татьяна к гимнастике otvetтатьяна хобби гимнастика Все о Петрове otvetпетров хобби лыжи otvetпетров любить ирина Кто любит кино Есть вопросы (Д|Н)Введите Ваш вопрос:

Чьим хобби является кино otvetирина хобби кино Кто чем увлекается otvetкирилл хобби хоккей 49 Терм может быть сложным, т. е. состоять из функтора и 5. Базовые понятия и термины Пролога списка термов, разделенных запятыми, который заключен в круглые скобки:

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

каждую проповедь так: "Сейчас я расскажу вам о том, о чем я буСтруктура – это другой термин для обозначения сложного ду говорить, затем я расскажу это, а затем я расскажу о том, о чем терма. Основной характеристикой структуры является ее размеря говорил", изложение материала подошло к точке, где я должен ность (или арность) – число термов в списке.

сказать о том, о чем я рассказывал.

Любая структура определяет некоторое отношение между составляющими ее термами (объектами). В таком случае функтор 5.1. Объекты – это имя отношения. Например, терм (факт) "Пролог – это язык программирования, предназначенный мяч(форма(сфера),материал(резина),размер(25), для обработки символьной нечисловой информации. Особенно цвет([синий,красный])) хорошо он приспособлен для решения задач, в которых фигуриопределяет конкретный объект класса "мяч". Функтор "мяч" руют объекты и отношения между ними" [1].

есть имя одноместного отношения "быть объектом".

Теперь вспомним, из каких "кирпичиков" строятся объекты.

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





о ней.

Домен – имя простого или составного терма (не функтор!), Стандартные типы данных являются "аксиоматическими" и которое, в свою очередь, может замещать этот терм в определении не нуждаются в объявлении. Поскольку PDC Prolog является стродругого сложного терма.

го типизированным языком, домены необходимы для определения domains предикатов ("процедур" с процедурной точки зрения на Пролог).

...............................

Простые домены следует рассматривать как характеристики dom1=functor1(integer,string) объектов, выраженные (в конечном итоге) в терминах встроенных dom2=functor2(symbol,real,dom1) типов.

...............................

Сложные домены определяют иерархию по вхождению меКонкретный экземпляр элементарного класса называется нее сложных объектов в более сложные.

атомом. Это – числовые, символьные и строчные константы.

Множество доменов, с помощью которых описываются все объекты отношения, называется системой типов.

Термы Задавая системы типов, мы подготовливаем поле для задаВсе типы данных в Прологе называются термами. Имя терния аксиом, которые в Прологе выражаются либо фактами внутма называется доменом.

ренней БД или безусловно верными предикатами (которые также Терм может быть простым. Простой терм – это любой класс называются фактами, пример: черный(X):-темный(X).

объектов, определяемый прямо (object = integer) или косвенно доТаким образом, сами логические процедуры могут служить меном стандартного типа:

в качестве описаний структур данных.

object2=object;object2=object*.

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

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

ложений.

Правила состоят из двух частей – головы правила и тела Часто используемый термин цель – это и есть теорема, или правила, соединенных логической связкой "если": (if|:-)." И синцелевое утверждение. Предложения и отдельные его утверждения таксически, и семантически левая часть правила представляет сорассматриваются как подцели.

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

фактами.

Левая часть правила или предложение, состоящее из одного В случае "Кто у нас большой и темный" вторая интерпреутверждения, называется предикатом.

тация конъюнкции большой(X),темный(X) – это теорема о сущеВ этом смысле раздел clauses содержит определения предиствовании большого и темного объекта X.

катов.

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

менные.

Предикат может содержать одно или несколько утверждеПеременная – символическое имя, которому может быть соний:

поставлен определенный домен (определенный в разделе domains женщина(умная).

или стандартный). Если сравнивать с русским языком, то переженщина(красивая).

менная – это местоимение, которое должно получить конкретное женщина(нежная).

значение. Переменная должна начинаться с буквы в верхнем региженщина(страстная).

стре (или символа подчеркивания) и может содержать только букженщина(сварливая).

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

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

случае говорят о "множественном определении предиката".

Переменная анонимная – переменная "_", используемая вмеЧисло объектов определяет арность предиката. Предикат сто обычной переменной в том случае, когда не важно значение женщина имеет арность, равную 1.

соответствующей ей обычной переменной.

Пример предиката нулевой арности:

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

женщина(красивая), Утверждение – одно или несколько отношений, связанных женщина(нежная), конъюнктивно (отношения, перечисляемые через запятую).

женщина(страстная).

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

53 5.2. Внутренние дела Пролога данному предикату. Эти различные действия получили название поточных вариантов предиката.

Pages:     | 1 |   ...   | 2 | 3 || 5 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.