
- •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. Операции со структурами данных.
5.2.4.Использование предиката not как средства управления
Предикат not использовался ранее, добавим несколько замечаний.
Умея теперь использовать предикаты fail и cut
можно написать:
not(P):-
P,
!,
fail;
true.
Иначе это можно записать так:
not(P):-P, !, fail.
not(P).
Здесь требуется именно такой порядок правил. Процедуры, в которых порядок правил может изменить значение программы, следует рассматривать как единый объект, а не как набор отдельных предложений. Отношение not здесь отличается от строгого логического отрицания. Оно трактуется как отсутствие. В дереве поиска должны отсутствовать успешные вершины, но не должно существовать бесконечных ветвей.
Предполагается, что not –встроенная процедура.
Информация о фактах, которые не являются истинными и об отношениях, которые не соблюдаются, называется отрицательной информацией. В явной форме такая информация в программе не хранится. Просто считается, что вся информация, отсутствующая в программе, ложна.
5.3.Метод повтора, определяемый пользователем (мп)
Правило повтора имеет вид:
repeat.
repeat:-repeat.
Правило, которое использует само себя как компоненту (третий repeat). Второй repeat вызывает третий repeat, и этот вызов всегда успешен, так как первый repeat удовлетворяет подцели repeat, следовательно, правило repeat также всегда успешно.
Предикат repeat будет вычисляться успешно при каждой новой попытке его вызвать после отката.Repeat используется в качестве компоненты других правил.
Листинг 5.7. Использование repeat для ввода и вывода на экран символов до тех пор пока не будет нажата клавиша ‘Enter’.(ASCII-код =13)
predicates
repeat
typewriter
clauses
repeat.
repeat:-
repeat.
typewriter:-
repeat,
write(“ input char”),nl,
readchar(Ch),
write(Ch),nl,
char_int(Ch,13),
write(“end”).
goal:typewriter,nl.
Встроенный предикат readсhar(Ch) читает новое значение, вводимое с клавиатуры только при первом вызове предиката и не делает этого при возврате (то есть если использовать здесь предикат fail, то повтора чтения не произойдет):
typewriter:-
readchar(Ch),
write(Ch),
fail.
Встроенный предикат repeat позволяет преодолеть эту трудность. Однако даже repeat при наличии fail не приведет к завершению программы, потому что комбинация repeat…..fail приводит к бесконечному циклу:
typewriter:-
repeat,
readchar(Ch),
write(ch),
fail.
Как выйти из комбинации repeat…fail? Очевидно, необходимо ввести индикатор завершения программы и заменить им предикат fail. Таким индикатором в нашей ситуации является нажатие на клавишу ‘Enter’.Для этого можно использовать стандартный предикат char_int(CharParam,IntParam), который успешен, если код символа CharParam совпадает со значением IntParam.
Листинг 5.8.Использование метода повтора для ввода двух новых чисел и получения их суммы.
predicates
sum(integer,integer,integer)
repeat
summa
check(integer,integer)
write_message
goal
clearwindow,
write_message,
summa.
clauses
repeat.
repeat:-
repeat.
write_message:-
nl,write(”input 2 integer number”),nl,
write(“for stop input 0 for X or Y”),nl,nl.
summa:-
repeat,
write(“input X=”),
readint(X),nl,
write(“input Y=”),
readint(Y),nl,
write(“X=”,X,” Y=”,Y),nl,
check(X,Y),!.
check(X,0):-
nl,write(“OK”).
check(Y,0):-
nl,write(“OK”).
check(X,Y):-
sum(X,Y,Z),
write(“ Z=”,Z),nl,
write(“input new integer”),nl,
write(“ numbers for X and for Y”),nl,
fail.
sum(X,Y,Z:-
Z=X+Y.
В данной программе для останова процесса сложения вместо одного из двух чисел(или вместо и того и другого) вводится 0.
Следует помнить, что:
-предикаты read и write читают и печатают свои значения только при первом вызове, поэтому fail здесь не поможет, а repeat будет на месте;
- правило repeat дает бесконечные циклы, поэтому нужен признак конца;
- все переменные теряют свои значения при откате обработки в позицию, предшествующую тем вызовам предиката, который эти значения устанавливал.
Замечания.
Если необходимо бесконечное выполнение, и окончание наступает только при возникновении каких- то исключительных ситуаций, то в не интерактивных программах можно использовать предикат exit, прекращающий выполнение программы. В интерактивных программах можно нажать клавишу <Break>.
Так как ни write(), ни readchar() не являются альтернативными, то возврат происходит к repeat,который всегда имеет альтернативные решения.
Обратите внимание на то, что Ch теряет свое значение после отката в позицию перед вызовом предиката readchar(Ch), который связывает переменную Ch.Такой тип освобождения переменной важен, когда поиск с возвратом применяется для определения альтернативных решений, но он не эффективен при использовании поиска с возвратом в других целях. Суть в том, что хотя поиск с возвратом и может повторять операции сколько угодно раз, но он не способен “запомнить” что-либо из одного повторения для другого. Поэтому write() надо сделать перед повтором, так как вы теряете при откате значение переменной.
Правило repeat позволяет получить бесконечные откаты. В МП откат может быть выполнен всегда в отличии от метода ОО, где откат выполняется только после искусственно созданного неуспешного результата. Но не следует забывать о необходимости введения признака завершения повторов.
Выводы
Предикат fail вызывает неуспшное завершение правила, заставляя внутренние унификационные программы выполнять откат, а процесс повторяться до тех пор, пока не будет обработано последнее утверждение.
Оператор отсечения cut предотвращает перебор с возвратами, не давая проверять альтернативные цели, если заранее известно, что они все равно окончатся неудачей.
Оператор отсечения позволяет сформулировать взаимоисключающие утверждения с помощью правил вида: если Условие, то Заключение 1,иначе Заключение 2.
Оператор отсечения позволяет сделать процедуру детерминированной.
Оператор отсечения может нарушить соответствие между декларативным и процедурным значениями программы, поэтому надо быть предельно осторожным при его использовании.
Оператор not как недостижение цели не полностью соответствует понятию отрицания в математике, поэтому и при работе с ним также требуется определенная осторожность.
Правило повтора repeat успешно при каждой новой попытке вызвать его после отката.
Эффективен при реализации доступа к данным в базе данных и файлах на диске. Используется для формирования меню и выдачи его на экран.