
- •1.Введение в функциональное и логическое программирование
- •1.1. Основные классы вычислительных моделей
- •1.1.1 Процедурная вычислительная модель
- •1.1.2 Функциональная вычислительная модель
- •1.1.3. Логическая вычислительная модель
- •1.1.4. Объектно-ориентированная вычислительная модель (ооп)
- •1.2.Метод оценки (способ получения результатов)
- •1.3. Обмен информацией в процессе оценки
- •1.4.Понятие искусственного интеллекта
- •1.5.Символьные языки программирования
- •1.6. Основные направления в искусственном интеллекте
- •Для работы в сфере ии надо иметь:
- •1) Языки ии, обеспечивающие простоту модификации
- •3) Важна и структура самой машины, позволяющая с
- •2.Основы логического программирования и язык Пролог.
- •2.1.Основные понятия
- •2.2.Определение отношений на основе фактов и правил
- •2.3 Пример программы на языке Пролог
- •2.4.Использование рекурсии
- •2.5.Декларативная и процедурная трактовка программы
- •2.6. Cтруктура программы
- •2.7.Особенности лп:
- •2.8 Использование предиката not и
- •3.Синтаксис Пролога
- •3.1. Объекты данных
- •3.2. Составные объекты и альтернативные домены. В утверждениях объекты представляют собой данные.
- •3.2.1. Составная структура
- •Листинг3.1. Использование доменной структуры с именем personal_library
- •3.2.2.Доменная структурная диаграмма программы “Библиотека” (дсд)
- •3.2.3.Предикатная структурная диаграмма программы “Библиотека” (псд)
- •3.2.4. Альтернативные домены
- •Выводы:
- •Рассмотрение работы с составными объектами и альтернативными доменами закончено. Посмотрим, как именно строится логический вывод, реализованный на эвм?
- •3.3. Сопоставление структур(matching)
- •3.4.Унификация и подстановки (Unify).
- •3.5.Основные правила поиска с возвратом:
- •Листинг 3.4.Унификация и поиск с возвратом
- •4.Принцип резолюции
- •Метод резолюции в исчислении предикатов – это пра-
- •4.1.Логическое следствие
- •4.2. Логический вывод
- •4.3 Преимущества и недостатки метода резолюции
- •4.4. Пример применения метода резолюций.
- •5. Управление поиском решений
- •5.1.Метод отката после неудачи – опн
- •5.2 Метод отсечения и отката – оо
- •5.2.1.Влияние предиката cut на составную цель
- •5.2.3. Использование зеленых и красных отсечений
- •5.2.4.Использование предиката not как средства управления
- •5.3.Метод повтора, определяемый пользователем (мп)
- •5.4.Методы организации рекурсии
- •Листинг 5.9. Бесконечная рекурсия (хвостовая рекурсия)
- •Пример программы, которая циклически считывает символ, введенный пользователем. Если символ не равен #, то он выводится на экран, иначе процесс заканчивается.
- •Листинг 5.14. Пример рекурсии для генерации ряда чисел в порядке возрастания
- •Определение
- •Список помогает сделать программу компактной, эффектив-
- •Список – это рекурсивный составной объект, поэтому
- •6.1.Операции над структурами данных типа список.
- •6.2.Предикат findall
- •6.3. Операции со структурами данных.
3.5.Основные правила поиска с возвратом:
подцели проверяются по порядку – сверху вниз
предложения проверяются в том порядке, в котором они появляются в программе
если подцель сопоставляется с заголовком правила, то тело правила поставляет новые подцели, которые должны быть доказаны
цель доказана, когда соответствующие факты найдены для каждой листьевой вершины дерева целей.
Вызов, который дает множество решений –недетерминированный
Вызов, дающий одно и только одно решение –детерминированный.
Листинг 3.4.Унификация и поиск с возвратом
predicates
likes(symbol, symbol)
tastes(symbol, symbol)
food(symbol)
clauses
likes(bill, X):-
food(X),
tastes(X, good).
tastes(pizza, good).
tastes(Brussels_sprouts, bad).
food(Brussels_sprouts).
food(pizza).
Поставим цель goal:likes(bill, What).
Таблица 3.1. Ручная трассировка программы
Стек активных целей |
Предложения программы |
Означивания переменных |
? likes(bill,What) |
likes(bill,X):- food(X), tastes(X,good).
likes(bill,What):- food(What), tastes(What,good) |
X=What X и What становятся одной и той же неконкре-тизированной переменной |
? food(What) |
*food(brussels_sprouts). food(pizza). |
What= brussels_ sprouts
|
? tastes(brussel_sprouts,good) |
tastes(pizza,good). tastes(brus_sp,bad). |
Отказ. Запускаем механизм возврата и ищем другое ре- шение W –освобождается,
|
? food(What) |
food(pizza). |
What=pizza |
? tastes(pizza,good) |
tastes(pizza,good). |
Это факт. Согласование получено.Успех What=pizza 1Solution |
Рис.3.2 .Иллюстрация прохождения процесса унификации и конкретизации переменных
4.Принцип резолюции
В ЛП все решаемые задачи могут быть представлены в виде теорем, которые должны быть доказаны в рамках исчисления предикатов первого порядка. Робинсон предложил удачный метод работы с предложениями. Этот метод легко реализуется на ЭВМ. В основе предложения Робинсона лежит принцип резолюции и основанные на нем методы доказательства теорем. Принцип резолюции – это метод вывода, который является непротиворечивым и полным. Это значит, что этим методом можно доказать лишь справедливые теоремы, причем если теорема справедлива, то она доказывается за конечное число шагов. Мы считаем множество S (наши утверждения) – внутренне непротиворечивыми. Непротиворечивость множества S будет гарантирована всякий раз, когда это множество содержит только правила и/или факты – а именно так обстоит дело в стандартном логическом программировании.
Основная стратегия доказательства заключается в том, чтобы показать несправедливость (противоречие) противоположной теоремы, а не пытаться непосредственно вывести исходную теорему (доказательство от противного - reductio absurdum)
У нас есть программа:
S1={F ,…..,Fn} – множество формул в разделе утверждений (clauses).
F
- цель (goal)
Формула
F
логически следует из S1
,если при каждой интерпретации, когда
все F
-истинны (то есть истинна их конъюнкция)
истинной является и F
.
Иначе, каждая интерпретация, удовлетворяющая
S1,
удовлетворяет и F
.
С точки зрения Пролога это означает, что формула, которую нужно доказать в прикладном исчислении предикатов первого порядка, должна логически следовать из множества формул, составляющих программу. Иначе программа будет работать неправильно, или приведет к неправильному результату.
Для того чтобы доказать, что Fn+1 логически следует из S1, можно доказать, что множество
S2=S1
{
F
}
является противоречивым, то есть
не существует интерпретации, в которой оно бы удовлетворялось.
В логике есть два классических правила вывода, открытых очень давно. Это – модус поненс и цепное заключение.
1.Modus Ponens -правило сокращения посылки путем применения импликации (отношение если….то) Если истинно А и истинно А--à(влечет)В, то можно вывести В(но не наоборот). То есть из двух данных предложений можно вывести третье(B).Корректность правила очевидна. Она получается из определения операции ВЛЕЧЕТ. Правило применимо к любой формуле.
( A
A-àB
B)
(“А влечет В” или “если А ,то В”) Рассуждения уместны только в одном направлении: зная А можно получить В, но не наоборот).Утверждение “если А, то В” будет правильным независимо от того, истинно В или ложно.
2.Цепное правило – позволяет вывести новую импликацию из двух данных импликаций.
Если истинно А-àВ и истинно В-àС, то можно вывести А-àС.Корректность очевидна: если истинность А влечет истинность В, и истинность В влечет истинность С, то истинность А влечет истинность С.
Из А àВ
В àС
Получаем АàС
Проблема доказательства в логике состоит в нахождении доказательства заключения на основании посылок.
Это можно сделать либо табличным способом с помощью построения таблиц истинности (алгебра логики), либо с помощью применения правил вывода.