Раньше это можно было зделать просто нажав на тест и посмотреть результаты а сейчас никак |
Логическое программирование нейронной сети
"Образование есть то, что остается после того, когда забывается все, чему нас учили".
8.1. ПРОЛОГ-программа
Следуя различными путями дедуктивного и индуктивного мышления, осуществляя различные парадигмы обучения, человек стремился автоматизировать логику мышления, немыслимую без формализации. Продуктом этой деятельности явились такие языки логического вывода, как ЛИСП и ПРОЛОГ. Язык ПРОЛОГ следует считать венцом усилий по автоматизации логического вывода, эффективно описывающего, в частности, экспертные системы.
ПРОЛОГ представляет базу знаний как совокупность фактов и правил (вывода). Процедурная структура позволяет включать конструкции любых других алгоритмических языков. То есть он является логической надстройкой, сублимирующей лишь операции логического вывода. Формулируется цель логического вывода, и если она не противоречива, выявляются факты, из которых эта цель следует.
И сознавая, что Природа создала единственное средство мышления — мозг, мы снова и снова пристально раздумываем, как же реализовать то, что гениально воплощено в языке логического программирования ПРОЛОГ?
Представьте себе село, затерянное в далекой таежной глуши. Навечно изолированные от Большой Жизни, его обитатели долгими зимними вечерами, в перерывах благотворного интеллектуального напряжения игры "Тигра идет", в сумраке демократических потугов вооружившись мозолистыми кулаками, выясняют степень взаимного родства.
И тут являетесь вы! Словно светоч озарения, сосланный за непримиримость свободолюбивых устремлений, вы, наконец, находите для себя непаханое поле действительно яркой деятельности, полной гуманизма и самопожертвования. Вы решаетесь положить конец сомнениям, и подобно искусному укротителю, внедряете важные элементы государственного акта переписи населения
Рассмотрим упрощенную задачу в виде ПРОЛОГ-программы, содержащую все характерные элементы решения проблемы удовлетворения (сложной) цели на основе лишь фрагмента базы знаний (БЗ), содержащего факты и правила.
Факты — клозы (отдельные предикаты-высказывания принято называть клозами ), которые не содержат правых частей, правила — клозы, которые содержат правые части; одноименные факты и правила объединяются в процедуры.
мужчина (иван)
мужчина (василий)
мужчина (петр)
мужчина (федор)
мужчина (юрий)
женщина (марья)
женщина (ирина)
женщина (ольга)
женщина (елена)
родитель (марья, иван) (Читать: "Марья — родитель Ивана")
родитель (иван, елена)
родитель (марья, василий)
родитель (федор, марья)
родитель (петр, ирина)
родитель (петр, иван)
родитель (федор, юрий)
мать (X, Y): — женщина (X), родитель (X, Y)
отец (X, Y): — мужчина (X), родитель (X, Y)
брат (X, Y): — мужчина (X), родитель (P,X), родитель (P, Y), X<>Y
сестра (X, Y): — женщина (X), родитель (P, X), родитель (P, Y), X<>Y
дядя (X,Y): — брат (X, P), родитель (P, Y)
Пусть задана некоторая сложная (т.е. опирающаяся не на факт, а требующая вывода) цель, с которой мы обратились в эту БЗ, например:
дядя (X, Y) (запись цели образует фрейм ),
и ее решение (вывод) заключается в нахождении всех пар переменных (имен объектов) X и Y, для которых справедливо утверждение " X является дядей Y ".
Для решения такой задачи используется прием трансформации цели, который заключается в рекурсивном переборе различных вариантов подстановки вместо предикатов, составляющих сложную цель, фактов или правых частей клозов соответствующих процедур. Производится фиксация варианта связывания переменных и унификация, при которой отбрасываются несовместимые варианты связывания, противоречащие фактам. Варианты связывания всех переменных, прошедшие все этапы унификации, являются решением.
То есть для решения данной задачи необходимо действовать следующим образом.
Находим первый (а он и единственный) предикат цели дядя (X, Y) . Находим в БЗ процедуру с этим именем и заменяем найденный предикат правой частью этой процедуры. Получим трансформированную цель — фрейм
брат (X, P), родитель (P, Y).
К первому предикату этого фрейма применяем аналогичные действия, получаем фрейм
мужчина (X), родитель (Q, X), родитель (Q, P), X<>P, родитель (P,Y)
(во избежание коллизии, развивая фрейм цели, вводим новые переменные, отличные от тех, которые до того уже были использованы.)
Вновь входим в процедуру с именем первого предиката цели. Начинаем первый уровень ветвления. А именно, первый клоз процедуры — факт мужчина (иван). С его помощью производим первое связывание переменных, т.е. подстановку конкретного значения. Предикат цели, породивший факт, т.е. это связывание, может быть исключен из трансформируемой цели, т.е. заменен своей "пустой" правой частью:
родитель (Q, иван), родитель (Q, P), иван <>P, родитель (P,Y).
Обращаемся к процедуре "родитель", начиная второй уровень ветвления. Первый клоз этой процедуры родитель (марья, иван) определяет дальнейшее связывание переменных:
родитель (марья, Р), иван <> P, родитель (P, Y).
Вновь входим в процедуру "родитель" (третий уровень ветвления), находим клоз родитель (марья, иван) . Трансформируем цель — получаем новый фрейм:
иван <> иван, родитель (иван, Y).
Получаем противоречие, т.е. не проходит унификация.
Ищем на данном шаге ветвления другой вариант связывания, находим следующий клоз:
родитель (марья, василий).
иван <> василий, родитель (василий, Y) -> родитель (василий, Y).
Вновь входим в процедуру "родитель", но не находим там клоза, в котором василий указан как чей-либо родитель. Т.е. вновь не проходит унификация — установление совместимости варианта связывания переменных.
Возвращаемся на шаг ветвления назад. (Реализуем стратегию поиска с ветвлением и возвращением назад — "backtraking".) На втором уровне ветвления пробуем клоз, в котором иван указан как сын: родитель (петр, иван) . Цель трансформируется в следующий фрейм:
родитель (петр, Р), иван <> P, родитель (P, Y).
Вновь (на третьем уровне ветвления) обращаемся к процедуре "родитель" и выбираем первый клоз, в котором петр указан как отец — родитель (петр, ирина).
иван <> ирина, родитель (ирина, Y) -> родитель (ирина, Y).
Входим в процедуру "родитель", но не находим там клоза, в котором ирина указана как родитель (не проходит унификация ).
Возвращаемся на второй уровень ветвления и не находим там больше клозов, где иван указан как сын. Возвращаемся на первый уровень ветвления и в процедуре "мужчина" выбираем для последующего испытания следующий клоз мужчина (василий).
родитель (Q, василий), родитель (Q, P), василий <> Р, родитель (P, Y).
Теперь на втором уровне ветвления находим первый (и единственный) клоз, в котором василий указан как сын. Цель трансформируется в соответствии с новым связыванием переменных, обусловленным найденным клозом родитель (марья, василий):
родитель (марья, Р), василий <> P, родитель (P, Y).
На третьем уровне ветвления находим первый клоз, где марья — родитель: родитель (марья, иван). Связываем тем самым переменные, цель трансформируется
василий <> иван, родитель (иван, Y) -> родитель (иван, Y).
Находим в процедуре "родитель" первый клоз, в котором иван указан как родитель — родитель (иван, елена) . Цель выродилась, значит
дядя (X, Y) = дядя (василий, елена) — одно из решений задачи.
Продолжив перебор так, словно на данном шаге унификация не прошла, можно найти остальные решения: дядя (юрий, иван), дядя (юрий, василий).
В основе распараллеливания решения этой задачи лежит способ размножения вариантов на основе трансформации цели. Способ обеспечивает отсутствие "backtracking'а" (ветвление есть, а возврата назад нет), простоту самой процедуры вывода, возможность неограниченного использования ИЛИ-параллелизма (одновременной независимой обработки многих вариантов связывания переменных), конвейерную реализацию И-параллелизма (распараллеливания обработки одного варианта связывания переменных на конвейере, т.к. каждый раз обрабатывается лишь первый предикат каждого фрейма ).
Однако представляется, что нейросетевая технология, основанная на естественном параллелизме, может оказаться эффективной.