Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Основные понятия Искусственного Интеллекта
ИИ это область информатики, предметом которой является создание комплексных систем, с возможностями естественного интеллекта.
Это способность распознавать зрительные и слуховые образы, понимать естественный язык, умение обучаться, рассуждать и делать логические выводы.
С самого начала исследования в области ИИ пошло по двум направлениям:
Данный подход является классическим для кибернетики с одним из ее базовых понятий черный ящик. Ч.Я.- устройство с информацией о внутренней структуре и, входные и выходные данные.
Для решения задач ИИ пришлось создавать собственные модели мышления.
В конце 50х появилась лабиринтная модель поиска. Согласно ей, решение задачи выполнялось путем перебора огромного количества вариантов. Которая представлялась в виде движения по лабиринту. Эта модель оказалась тупиковой.
Начало 60х. Эта эпоха эвристического программирования. ЭП это разработка стратегий и действий на основе заранее заданных эвристик. Эвристика это теоретически не обоснованное правило, не позволяющее сократить количество переборов в пространстве поиска.
В 70х к решению задач стали подключать методы мат логики, в основе которой лежала булева алгебра. Дальнейшее развитие эта алгебра получила в виде исчисления предикатов. На логике предикатов был разработан язык логического программирования PROLOG.
Добиться большей выразительности логическому подходу позволяет новое направление нечеткой логики. Основным ее отличием является то, что правдивость высказывания в ней, может принимать значения не только да/нет (1/0), но и промежуточное значение не знаю (0,5).
Существующий прорыв в практических приложениях ИИ произошел в середине 70х, когда на смену поискам универсального алгоритма мышления, пришла идея моделировать конкретные знания специалистов. В США появились 1е Экспертные системы (системы, основанные на знаниях). Система ИИ это система, созданная на базе компьютеров, которые имитируют решения человеком сложных интеллектуальных задач. Разработка интеллектуальных программ отличается от обычного программирования и ведется построением системы ИИ.
Основным отличительным признаком системы ИИ, является работа со знаниями.
Основные направления исследований в области Искусственного Интеллекта
Выделяют 2 направления:
Первый нейрокомпьютером считают перцептрон разработанный Ромен Блаттом. Эта программа моделировала глаз человека и ее взаимодействие с мозгом. Она распознавала буквы, но была чувствительна к написанию этих букв.
Существуют системы, сочетающие в себе и те и другие свойства (в робототехнике).
Логическое программирование. Основные понятия языка Пролог (Предикаты, Факты, Правила, Простые и составные запросы).
Программа на прологе состоит из предложений. Предложения трех видов: факты, правила, вопросы. Все предложения строятся из термов (синтаксическая единица).
На Прологе описываются объекты и факты, затем описываются правила, при которых эти факты являются истинными.
Факт это предложение, которое истинное всегда.
Например, рассмотрим такой факт: like(kola, apple). Предикат like говорит о том, что Коля любит яблоки. Like это аргумент / имя терма / функтор. (kola, apple) это аргументы предиката.
Правила позволяют вывести один факт из других фактов. Другими словами, можно сказать, что правило это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными. Тело правила это ряд условий, которые должны быть истинными, чтобы Prolog мог доказать, что заголовок правила истинен. Тело правила состоит из термов, встроенных предикатов связанных «,/;».
Например: like(mike, X):-like(anna, X). Если Анна любит Х, то и Майк тоже это любит.
В Прологе можно задать вопрос (поставить цель). Она может быть внутренней и внешней. Внутренняя цель записывается в самой программе, в разделе Goal. Внешняя цель вызывается при запуске программы на выполнение. Она может содержать несколько подцелей.
Например, рассмотрим факты:
year(ivanov, 25).
year(grishko, 30).
Цель: year(ivanov, X). Сколько лет Иванову? Ответ: X = 25.
Цель: year(X,30). Кому 30 лет? Ответ: X= grishko.
Цель: year(ivanov, 20) Иванову 20 лет? Ответ: не.
Константы, переменные и составные термы. Сопоставление.
Переменные в прологе инициализируются при сопоставлении с константами фактов и правил, до инициализации переменная свободна, а после инициализации становится связанной (в пределах одного предложения). Переменные используются, как часть процесса поиска решения. Константы это поименованные конкретные объекты или отношения. Переменные служат для обозначения объектов, значение которых меняется в ходе выполнения программы. Имена переменных могут начинаться с прописной буквы или с символа подчеркивания. Если значение переменной не интересует, то можно использовать анонимные переменные в виде символа подчеркивания.
Наиболее важной операцией над термами является сопоставление.
Сопоставление это процесс, на вход которого подаются 2 терма, а он проверяет соответствуют ли термы друг другу. 2 терма сопоставимы, если они идентичны или переменные в обеих термах можно приписать в качестве значений объекты таким образом, чтобы после постановки этих объектов в термы, вместо переменных последние стали идентичны.
Например:
data (20, “may”, Y)
data (X,A,B)
сопоставимы если Х=20, А=may, В=Y.
Основные разделы Prolog. Встроенные предикаты
Программа на Прологе состоит из нескольких программных секций:
Constant |
Объявление констант |
|
Domains |
Определение типов данных |
раздел domains содержит определения доменов, которые описывают различные типы объектов, используемых в программе, если используются стандартные типы, то раздел может не использоваться; |
Database |
Объявление предикатов базы данных |
Раздел Database содержит описание предикатов динамической (внутренней) базы данных, которые являются предикатами базы данных и могут быть изменены в процессе работы программы без перекомпиляции, если программа такой базы данных не требует, то этот раздел может быть опущен; |
Predicates |
Объявление предикатов |
раздел predicates служит для описания используемых программой предикатов, этот раздел является обязательным; |
Clauses |
Определение фактов или правил |
в раздел clauses заносятся факты и правила статической базы данных, которая и является собственно программой, этот раздел является обязательным; |
Goal |
Цель |
в разделе goal на языке Пролога формулируется цель( запрос) созданной программы. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы, этот раздел является обязательным |
В пролог программе существуют встроенные предикаты, такие как:
Арифметические вычисления и сравнения в прологе
Основные арифметические операции: +, -, *, /, mod, div;
Основные функции: abs, cos, sin, tan,arctan, exp, ln, log, sqrt, trunc, round.
В прологе имеется встроенный предикат = (операция соспоставления), которыйозначает сопоставление, если слева находится переменная, которая еще не получила значение.
Например A = 5, X = sin(A), Y = sqrt(A), write(X,” ”, Y)
В прологе используются операции сравнения: <,>,<=,>=.
Арифметические операции вычисляются в следующем порядке:
Встроенные предикаты ввода и вывода
Предикат readln считывает строку с текущего устройства ввода и связывает ее со своим единственным выходным параметром.
Предикат readint читает с текущего устройства целое число и связывает его со своим единственным выходным параметром.
Предикат readreal отличается от предиката readint тем, что он считывает не целое, а вещественное число.
Для чтения символа с текущего устройства ввода используется предикат readchar. Есть еще предикат inkey, который так же, как и readchar, читает символ со стандартного устройства ввода. Разница между ними в том, что предикат readchar приостанавливает работу программы до тех пор, пока не будет введен символ, а предикат inkey не прерывает выполнение программы. Если нужно просто проверить, нажата ли клавиша, можно воспользоваться предикатом keypressed, не имеющим аргументов.
Предикат readterm предназначен для чтения сложных термов. У него два параметра: первый входной указывает имя домена, второй параметр конкретизируется термом домена, записанного в первом параметре. Если считанная этим предикатом строка не соответствует домену, указанному в его первом параметре, предикат выдаст сообщение об ошибке.
Для записи данных в текущее устройство записи служит предикат write. Он может иметь произвольное количество параметров. Кроме того, в Турбо Прологе есть еще и предикат writef, который служит для форматного вывода данных.
Для осуществления перехода на следующую строку (возврат каретки и перевод строки) применяется предикат nl, не имеющий параметров.
Управление поиском решений. Встроенный механизм поиска с возвратом. Использование предиката fail и отсечение.
Основной операцией в Прологе при поиске решений, является операция сопоставления цели с имеющимися в программе фактами, для получения логического вывода об истине или лжи значений цели.
В прологе имеются средства позволяющие управлять, при необходимости, процессом поиска решений. Для организации повторений можно применять встроенный предикат «fail». Выполнение этого предиката всегда дает ложное значение.
Например: В прологе содержатся имена городов, вывести все имена во внутренней цели.
Predicates
city(symbol)
show
Clauses
city(moskow).
city(kiev).
city(kazan).
show :- city(X), write(X), nl, fail.
Goal
show.
На экране увидим:
moskow
kiev
kazan
Замечание: Всегда ложный предикат fail, вызывает откат для поиска других утверждений, который может обеспечить выполнение цели, без fail, то для внутренней цели поиск был бы прекращен, после нахождения названия первого города. Применение этого метода, позволяет извлекать данные из каждого утверждения.
Для того чтобы иметь возможность выбирать данные удовлетворяющие некоторым условиям, необходимо иметь средство управления откатом. В прологе для этого используется предикат отсечения (!). Этот предикат, вычисление которого всегда успешно, заставляет внутри программы сопоставления забыть все указатели отката, установления во время попыток вычислить предыдущие подцели.
Рекурсия
Для организации повторений, в прологе используется рекурсия.
Рекурсия это предикат, вызывающий сам себя, до тех пор, пока не будет соблюдено некоторое условие, которое остановит рекурсию.
Пример рекурсии: найти факториал n!.
Задача нахождения значения факториала n! очень хорошо решается с помощью рекурсии, поскольку может быть сведена к решению аналогичной подзадачи, которая, в свою очередь, сводится к решению аналогичной подзадачи и т.д.
Действительно, чтобы найти значение факториала n!, можно найти значение факториала (n-1)! и умножить найденное значения на n. Для нахождения значения факториала (n-1)! можно пойти по уже известному пути - найти значение факториала (n-2)! и умножить найденное значения на n-1. Так можно действовать до тех пор, пока не доберемся до нахождения значения факториала (n-n)! или другими словами, факториала 0!. Значение факториала 0! известно - это 1. Вот это и будет граничное условие, которое позволит остановить рекурсию. Все, что теперь остается - это умножить полученную единицу на (n-(n-1)), затем на (n-(n-2)) и т.д. столько раз, сколько было рекурсивных вызовов. Результат n! получен.
Вот как выглядит программа, которая проделывает вычисление n! (нужно заметить, что предложения Prolog - программы достаточно точно повторяют формулировку задачи на естественном языке).
PREDICATES
factorial (integer, integer)
CLAUSES
%факториал 0! равен 1
factorial (0, 1):- !.
%факториал n! равен факториалу (n-1)!, умноженному на n
factorial (N, Factorial_N):- M=N-1, factorial (M, Factorial_M),
Factorial_N=Factorial_M*N.
GOAL
write ("Для какого числа Вы хотите найти факториал? "), readint (Number),
factorial (Number, Result), write (Number, "!=", Result).
Результат работы программы: 3!=6
Обработка списков. Объявление и использование.
Списки это упорядоченный набор объектов одного и того же типа следующие друг за другом. Объектами списка могут быть целые, действительные, символьные величины, строки, и сложные объекты. Совокупность элементов списка заключается в [ , ] . Количество элементов списка это длина. Список, не содержащий ни одного элемента, называется пустым. При описании списков, после указания типа или имени списка, ставится символ *.
Domains
list = integer*
name = symbol
listname = name*
Для обработки списка, его делят на голову и хвост. Голова это первый элемент списка, а хвост вся его остальная часть.
Операции деления списка на голову и хвост изображают в виде вертикальной черты [Head | Tail]. Данное определение позволяет организовать рекурсию списков, разделяя непустой список на голову и хвост. Хвост в свою очередь также является списком, который можно разделить на голову и хвост. И так до тех пор, пока список не окажется пустым, у которого нет головы.
Обработка строк. Предикаты для строк. Встроенные предикаты для преобразования типов. Использование строк.
Предикаты обработки строк используются для разделения строк либо на список отдельных символов, либо на список заданных групп символов.
frontchar(String,FrontChar,RestString)
Разделяет заданную строку String согласно поточному шаблону на две части: первый символ FrontChar и оставшаяся часть строки RestString.
fronttoken(String,Token,RestString)
Разделяет строку, заданную параметром String, на лексему Token и остаток RestString согласно поточному шаблону. (Лексема это последовательность символов, имеющих смысл. Она определяется либо как имя в соответствии с синтаксисом Турбо-Пролога, либо как строчное представление числа, при этом знак возвращается отдельно, либо как отдельный символ.)
frontstr(Lenght,Inpstring,StartString,RestString)
Разделяет строку Inpstring на две части. StartString будет иметь длину Lenght первых символов исходной строки, RestString представляет собой остаток строки InpString.
concat(String1,String2,String3)
Слияние строк , согласно поточному шаблону, по формуле: String3 = String1 + String2.
str_len(String,Length)
Определяет длину Length строки String.
isname(StringParam)
Завершается успешно, если StringParam есть имя, удовлетворяющее синтаксису Пролога.
Стандартные предикаты для преобразования одного типа в другой.
char_int(Char,Code)
str_int(String,Integer)
str_char(String,Char)
str_real(String,real)
Файлы. Оисание. Стандартные предикаты. Операции над файлами.
Для описания файлового типа используется служебное слово file, описание:
file=символическое имя файла
Символические имена должны начинаться со строчной буквы. В прологе имеются стандартные файлы,которые не нужно описывать в разделе описания доменов
stdin стандартное устройство ввода (по умолчанию является клавиатура)
stdout стандартное устройство вывода. (монитор)
Для работы пользователя с файлом, его нужно открыть,а по завершению закрыть.
Стандарное устройство ввода и вывода открывать и закрывать не нужно.
Стандартные предикаты для работы с файлами
1)предикат для открытия файла
openread(f,N) открывает файл для чтения, первый параметр это внутреннее или символическое имя файла, второе строка задающая внешнее имя файла. Если файл с указанным внешним именем не обнаружен,то предикат ложный, и выводится ошибка.
openwrite(f,N) открывает файл для записи, записывает в новый файл, если уже сущетсвует файл с таким именем,то он будет стерт. Если файл не создан ошибка.
openappend(f,N) открывает файл для записи в конец файла. Если файл с указанным именем не найден,то выводится сообщение об ошибке.
openmodify(f,N) открывает файл для чтения и записи. Если файла нет, то ошибка.
2)проверка на существование файла на диске
existfile(N) истинен, если файл с указанным именем сущ-т, иначе ложен.
3)закрытие файла
closefile(f) закрывает файл.
4) удаление и переименование файла
deletfile(N) удаляет файл, но предварительно файл должен быть закрыт, если файл удалить не получится, то выводится об этом сообщение. closefile(f). deletfile(“d:\\a.txt'')
renamefile(N,New) Переименовывает файл N в New. Файл должен быть закрыт. closefile(f), renamefile(“c:\\b.txt”,”c:\\c.txt”).
5)проверка конца файла: eof(f) успешен, если достигнут конец файла.
6)переопределение текущего уст-ва ввода и вывода
readdevice(имя устр-ва) опр-т уст-во для ввода информации: readdevice(f) readdevice(klybard)
writedevice(имя уст-ва) опр-т уст-во для вывода информации: writedevice(screen)
7)для вывода иформации, используются встроенные предикаты: write, writef, nl
8)для ввода предикаты: readreal, readint, readln, readchar, readterm.
Работа с внутренними базами данных: добавление и удаление фактов из базы данных.
В прологе легко реализуются реляционные БД. Любая таблица этой БД, может быть описана соответствующим набором фактов, где каждой записи таблицы будет соответствовать один факт, каждому полю аргумент предиката реализующего таблицу.
Внутренняя БД это БД, которая обрабатывается исключительно в оперативной памяти компьютера, в отличии от внешней, которая может обрабатываться на диске.
Внутренняя БД обрабатывается быстрее, но ее объем ограничен объемом оперативной памяти. Для обработки больших массивов данных, используют внешние БД.
Внутренняя БД состоит из фактов, которые можно в процессе компиляции добавлять в БД, удалять из БД, сохранять в файле, загружать факты из файла БД. Эти факты могут использовать только предикаты описанные в разделе предикатов БД.
Database имя БД имя предиката. (имя домена аргумент1, …. аргумент n).
Если раздел описания предикатов БД в программе только1, то БД может не иметь имени, в этом случае имя по-умолчанию; в случае наличия в программе нескольких БД, только 1 из них может быть без имени. Описание предикатов БД аналогично описанию предикатов раздела predicates. Однако, эти предикаты можно использовать в качестве аргументов встроенных предикатов. Кроме того, факты использующие эти предикаты можно добавлять и удалять во время компиляции.
В БД могут содержаться только факты. Встроенные предикаты для работы в БД, могут содержать один/два аргумента. Одноаргументный вариант использования, если внутренняя БД не имеет имени. Если же база именована, то используются два аргумента в предикате, причем второй аргумент это имя БД.
Для добавления фактов во внутреннюю БД используются предикаты: asserta - в начало БД; assertz, assert в конец БД.
Для удаления фактов из БД используются: retract удаляет первый сначала факт, который может быть отождествлен с его первым параметром. Для удаления всех фактов из БД используется retractall, первым аргументом может быть анонимная переменная.
Для сохранения динамической БД на диске: предикат save. Он сохраняет ее в текстовый файл, с именем, которое было указано в качестве первого параметра предиката. Факты, сохраненные в текстовом файле, могут быть загружены в оперативную память компьютера предикатом consult. Первый аргумент этого предиката имя текстового файла, с которого нужно загрузить факты. Один факт должен занимать одну строку. Количество и тип аргументов должны соответствовать описанию предиката в разделе database. В файле не должно быть пустых строк, внутри фактов не должно быть пробелов, за исключение тех, которые содержатся внутри строк в кавычках.
Данные и знания.
Данные это отдельные факты, характеризующие объекты, проессы и явления предметной области.
Знания это выявленные закономерности предметной области (принципы, связи, законы), позволяющие решать задачи в этой области.
Знания представленные в интеллектуальной системе, образуют базу знаний.
Представление знаний это соглашение о том, как описать реальный мир.
Основная цель представления знаний - строить математическую модель реальности и мира, для которых, соответствие между системой понятий проблемного знания может быть установлено на основе совпадение имен переменных модели и имен понятий, без предварительных пояснений и установление дополнительных соответствий.
Существуют следующие основные модели представления знаний: