Интерпретатор Пролога
Пролог находит в базе знаний факт, соответствующий первой цели (подвопросу) и пытается подобрать факт, удовлетворяющий остальным целям таким образом, чтобы одна и та же переменная имела одно и то же значение при поиске одного варианта решения. Возврат для поиска новых решений идет обратно по цепочке целей. Рассмотрим программу: domains имя=symbol predikates отец(имя, имя) дед(имя, имя) clauses 10 отец(алексей, владимир). 20 отец(андрей, алексей). 30 дед(X, Y): - отец(X, Z), отец(Z, Y). Пусть задан вопрос: дед(X, Y). Он помещается в стек вопросов (целей) с состоянием 40 дед(X, Y). В первом цикле интерпретатор просматривает сверху вниз пункты программы 10-30. Он пытается унифицировать первый литерал из стека (в данном примере литерал всего один) с первыми литералами предложений 10-30. Только правило 30 в нашем примере может быть унифицировано с предложением 40. Перед унификацией интерпретатор переименовывает переменные в пункте 30: X ® X1, Y ® Y1, Z ® Z1. Унификация предложений 40 и 30 требует замену: X вместо X1, Y вместо Y1. После унификации литерала из стека вопросов 40 и правила 30 содержимое стека замещаетсяусловной частью правила 30: 40a отец(X, Z1), отец(Z1, Y). Пр2: есть очень Сл: есть .
III. Пр1: если есть , то есть Пр2: есть более или менее Сл: есть более или менее .
IV-1. Пр1: если есть , то есть Пр2: есть не Сл: неизвестно.
IV-2. Пр1: если есть , то есть Пр2: есть не Сл: есть не , где “Пр” – предпосылка, “Сл” – следствие, = ()/ , = ()/ , ”очень ” = , “более или менее ” = ( - любое нечеткое множество). Условие-неравенство: ()Ù ( () ())£ (), где “ ” – импликация, зависящая от вида нечеткой логики . Пример: = , = =0+1+2+3+4+5+6+7+8+9+10, =мало=1/0+0.8/1+0.6/2+0.4/3+0.2/4, =средне=0.2/2+0.4/3+0.8/4+1/5+0.8/6+0.4/7+0.2/8. Проверим правило-критерий I. Для этого сначала найдем бинарное отношение ( (), ()) между и в предпосылке Пр1 ( (), () – множества, определяемые атрибутами , , принимающими значения из , соответственно). Предпосылка Пр1 - “если есть , то есть ” - содержит два унарных отношения: ( ())= и ( ())= . Из всех возможных отношений ( (), ()) выберем отношение вида ( (), ()) = = = () () ) /(, ), где () ()= (, ). Тогда с учетом табл.1.3, где = (), = (), можно рассчитать ( (), ()) следующим образом:
При описании предложений типа фактов на языке Пролог необходимо соблюдать правила: - имена объектов (сущностей) и отношений состоят из латинских букв, цифр, знаков подчеркивания и начинаются со строчной буквы; - первым в предложении указывается имя отношения, за которым в скобках указываются имена объектов, разделяемых запятыми; - факт заканчивается точкой, порядок перечисления объектов в скобках произволен, но постоянен. Имена объектов в круглых скобках называются аргументами, а имя отношения – предикатом. Имена объектов и отношений выбираются произвольно. Отношения могут иметь произвольное число аргументов. Аргументы могут быть представлены константами или переменными. Пример (для удобства чтения наряду с латинскими будем использовать русские буквы): вопрос “ отец(виктор, X) ” переводится как “отцом каких детей является Виктор? ”. Для нахождения ответа просматриваются имена всех имеющихся в наличии объектов, отец которых – Виктор. Ответов может быть несколько, например: 1) X =таня, 2) X=оля. Подвопросы в предложениях отделяются запятыми (союз “и”). Примеры: 1. нравится(виктор, анна), нравится (анна, виктор) – нравятся ли Виктор и Анна друг другу?. 2. нравится(виктор, X), нравится(анна, X) – что нравится обоим – Виктору и Анне?. Факты в программе на языке Пролог записываются в разделе clauses. Пример программы на языке Пролог, содержащей факты: domains имя=symbol predikates отец(имя, имя) муж(имя, имя) clauses отец(виктор, таня). отец(виктор, оля). отец(виктор, даша). отец(владимир, виктор). отец(владимир, сергей). муж(виктор, анна). муж(владимир, люда). Здесь domains - определение аргументов, predikates - формат предикатов, clauses – факты и правила. На запрос отец(X, Y) Пролог отвечает в соответствии с принципом поиска всех решений: X=виктор, Y=таня X=виктор, Y=оля 50. = =5, = =0; ()=0, (, )=1; =0Ù 1=0 и т. д. Очевидно, что ()= [ ()Ù (, )]=0. Аналогично находим ()=0. Далее: 02. = =0, = =2; ()=1, (, )=0.2; ()Ù (, )=1Ù 0.2=0.2= . 12. = =1, = =2; ()=0.8, ( , )=0.2; =0.8Ù 0.2=0.2; 42. = =4, = =2; ()=0.2, (, )=1; =0.2Ù 1=0.2. 52. = =5, = =2; ()=0, (, )=1; =0Ù 1=0 и т. д. до =0. Для этих пунктов ()= [ ()Ù (, )]=0.2. После нахождения всех значений () имеем:
( ())=0.2/2+0.4/3+0.8/4+1/5+0.8/6+0.4/7+0.2/8 = = средне.
|