
- •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.4.Унификация и подстановки (Unify).
ОТКАТ (ПОИСК С ВОЗВРАТОМ)( BACKTRACKING)
На программу можно взглянуть с логической точки зрения или с процедурной точки зрения.
Цель используется для запуска процесса выполнения программы. Можно рассматривать цель как вызов процедуры. Чтобы цель была доказана, надо, чтобы вызываемая ею процедура была успешно выполнена. Обычно аргументы вызова процедуры – выражения, которые подставляются вместо формальных параметров, являющихся именами переменных. Но Пролог позволяет формальным параметрам самим быть термами. Поэтому процесс вызова “логической” процедуры включает совмещение термов, являющихся аргументами вызова, с термами из заголовков процедур. Этот процесс называется унификацией. Унификация является ключевым компонентом любых алгоритмов вывода в логике первого порядка.
Унификацией называется процесс нахождения наиболее общей подстановки, делающей два терма одинаковыми.
Если унификация оканчивается неудачно из-за того, что никакая подстановка не смогла совместить аргументы вызова и термы заголовков, то вызова не произойдет, но будет сделана попытка совмещения с другим определением процедуры, если оно есть. (Это называется “вызов с поиском по образцу”, или поиск с возвратом).
Можно сказать, что унификация – это взаимное приведение двух структур к общему виду. В результате унификации возникают связи переменных, делающих сравниваемые структуры идентичными. Унификация двух предикатов не обязана быть единственно возможной. В этом случае выбирается наиболее общая подстановка. Она то и называется унификацией. Применяя принцип резолюции для доказательства цели, мы неизменно используем алгоритм, который всегда приводит к наиболее общему унификатору(Most General Unifier –MGU-НОУ), или сообщает о невозможности это сделать, если множество – не унифицируемо, то есть если предикаты унифицируемы, то НОУ всегда существует и при этом только один! Если унификатора нет, то вывод невозможен. В процессе работы внутренних унификационных подпрограмм происходит означивание (связывание) переменных.
Замечания:
если оба значения в момент конкретизации известны, то знак равенства используется как оператор сравнения map=map, и в результате получаем успех, или неуспех, если map=lamp,например;
Если одно из значений является переменной,то знак равенства может быть как оператором присваивания, так и оператором сравнения.
Например, X=map.Если X была свободная переменная, то присваивание. Если X – означенная переменная, то знак равенства означает сравнение.
В процессе унификации мы находим нужную подстановку.
Подстановкой Q называется множество присваиваний вида X=t, где X-переменная, t-терм. Каждой переменной присваивается не более одного значения. Подстановка, которая привела к тому, что два предиката стали идентичными, называется унификатором.
Например, Unify(P1,P2)=Q, где P1 и P2-предикаты.
Если P1Q=P2Q, тогда Q – унификатор, а P1 и P2- стали идентичными.
Определим, какая подстановка приведет к тому, что предложенные ниже предикаты станут идентичными?
1 Р(1) и Р(1) ?
Q={}- ?
Q={}-пустое множество, так как нет замены переменных.
Общий пример Р(1)
2 Р(х) и Р(1) ?
Q={x:=1}
Общий пример Р(x)Q=P(1)Q=P(1)
3 P(x) и P(y)
Q={x:=y}
Общий пример P(y)
4 P(x,x) P(1,y)
x:=1 y:=x:=1
Q={x:=1,y:=1}
Общий пример P(1,1)
Алгоритм унификации – это основа вычислительной модели ЛП. Он включает в себя связывание вызова с конкретным предложением. Унификация реализует процедуры передачи параметров, выбор варианта(case),создание структуры, доступ к структуре, присваивание переменным конкретного значения во время связывания Переменная становится свободной, когда сопоставление оказывается неуспешным, или цель оказывается успешно выполненной.
Алгоритм унификации основан на решении системы равенств. На вход подают два терма Т1 и Т2 Результат работы алгоритма – так называемый наиболее общий унификатор двух термов, если термы унифицируемы, или отказ, если они не унифицируемы.
Замечание1:
1) Унификация составных объектов:
с простой переменной - для передачи целого набора значений как единого объекта. Например:
name(“liz”,”petrova”) сопоставляется с X.
X=name(“liz”,”petrova”).
с составным объектом, который может содержать переменные в качестве частей внутренней структуры. В этом случае применение унификации используется для разделения составного объекта на части.
name(“liz”,”petrova”) сопоставляется с name(X,Y)
X=liz
Y=petrova
2) использование знака равенства для унификации составных объектов (а не только при сопоставлении цели с заголовком предложения) Фактически Пролог выполняет операции присваивания для унификации объектов по разные стороны знака равенства. Это свойство полезно для нахождения значений аргументов составного объекта.
Листинг 3.3.Использование знака равенства для унификации составных объектов
domains
person=person(name, address)
name=name(first, last)
address=addr(city,street))
street=street(number, street_name)
city, state, street_name=string
first, last=string
number=integer
goal
P1=person(name(jim,black),addr(pskov,street(25,mira)),
P1=person(name(_,black),Address),
P2=person(name(jane,black),Address),
write(“P1=”,P1,nl,
write(“P2=”,P2), nl.
Программа проверяет, совпадают ли фамилии у двух людей, и затем дает второму человеку тот же адрес, что и у первого. Знак равенства является инфиксным предикатом.
Замечание2:
Алгоритм унификации очень прост: он рекурсивно исследует два выражения одновременно, и в ходе этого исследования формирует унификатор, но может закончиться и неудачей, если структуры окажутся несопоставимыми. Но при этом есть один маленький нюанс: если переменная согласуется со сложным термом, необходимо произвести проверку того, встречается ли сама эта переменная внутри терма; если встречается, то согласование окончится неудачей, потому что будет невозможно сформировать какой-либо совместный унификатор. Эта операция носит название “проверка вхождения”(occur check). Но к сожалению именно из-за этой проверки сложность всего алгоритма становится квадратично зависимой от размера унифицируемых выражений. Все системы логического программирования просто исключают проверку вхождения и поэтому иногда могут сформироваться противоречивые логические выводы. Это случается крайне редко, но это означит, что унификация, проводимая в логическом программировании не является строго унификацией.
Как проходит процесс унификации?
- Пролог начинает поиск с начала программы.
- Если вызов завершился успешно, то делается попытка доказать следующую подцель.
- Если переменная была связана в предложении, то единственный способ сделать ее снова свободной - это откат.
ОТКАТ -автоматически исполняемый процесс. Это механизм, который используется для нахождения дополнительных фактов и правил, необходимых при вычислении цели, если текущая попытка вычислить цель оказалась неудачной. Пролог должен рассмотреть все возможные варианты нахождения решения и поэтому должен запомнить точки, в которых он может продолжить альтернативные попытки найти решение.
Это специальные указатели, определяющие точки, в которые может быть выполнен откат, если текущая попытка будет неудачной. Если некоторая подцель оказывается неуспешной, то Пролог откатывается влево и останавливается у ближайшего указателя отката. С этой точки Пролог начнет попытку найти другое решение для неуспешной цели.