После приведения формулы вида ПНФ к виду ССФ вы получаете формулу, в безквантовой матрице которой дизъюнкт содержит оба контранрных атома:. Как тогда проводить его унификацию, если в случае замены x на f(x) весь дизъюнкт обратится в единицу? |
Основные понятия Пролога
Третьим специфическим видом предложений Пролога можно считать вопросы.
Вопрос состоит только из тела и может быть выражен с помощью БНФ в виде:
<Вопрос>::=<Предикат>[,<Предикат>]*
Вопросы используют для выяснения выполнимости некоторого отношения между описанными в программе объектами. Система рассматривает вопрос как цель, к которой надо стремиться. Ответ на вопрос может оказаться положительным или отрицательным, в зависимости от того, может ли быть достигнута соответствующая цель.
Программа на Прологе может содержать вопрос в программе (так называемая внутренняя цель ). Если программа содержит внутреннюю цель, то после запуска программы на выполнение система проверяет достижимость заданной цели.
Если внутренней цели в программе нет, то после запуска программы система выдает приглашение вводить вопросы в диалоговом режиме ( внешняя цель ). Программа, компилируемая в исполняемый файл, обязательно должна иметь внутреннюю цель.
Если цель достигнута, система отвечает, что у нее есть информация, позволяющая сделать вывод об истинности вопроса ( "Yes" ). При этом если в вопросе содержатся переменные, то система либо выдает их значения, приводящие к решению, если решение существует, либо сообщает, что решений нет ( "No solution" ). Если достичь цели не удалось, система ответит, что у нее нет положительного ответа ( "No" ).
Следует заметить, что ответ "No" на вопрос не всегда означает, что отношение, о котором был задан вопрос, не выполняется. Система может дать такой ответ и в том случае, когда у нее просто нет информации, позволяющей положительно ответить на вопрос.
Можно сказать, что утверждение - это правило, а факт или вопрос - это его частный случай.
Рассмотрим несколько примеров. Пусть в программе заданы следующие отношения:
мама("Наташа","Даша"). мама("Даша","Маша").
Можно спросить у системы, является ли Наташа мамой Даши. Этот вопрос можно ввести в виде:
мама("Наташа","Даша")
Найдя соответствующий факт в программе, система ответит "Yes" (то есть "Да" ). Если мы спросим:
мама("Наташа","Маша")
то получим ответ "No" (то есть "Нет" ). Можно также попросить вывести имя мамы Даши:
мама(X,Даша).
Система сопоставит вопрос с первым фактом, конкретизирует переменную X значением " Наташа " и выдаст ответ:
X=Наташа 1 Solution
Вопрос об имени дочери Наташи записывается в виде:
мама(Наташа,X).
Соответствующим ответом будет:
X=Даша 1 Solution
Можно попросить систему найти имена всех известных ей мам и дочек, задав вопрос:
мама(X,Y).
Система последовательно будет пытаться согласовывать вопрос с имеющимися в программе предложениями от первого до последнего. В случае успешной унификации соответствующих термов переменная X будет означена именем матери, а переменная Y - именем ее дочери.
В итоге получим ответ:
X=Наташа Y=Даша X=Даша Y=Маша 2 solutions
Если надо получить только имена всех мам, можно воспользоваться анонимной переменной и записать вопрос:
мама(X,_).
Получим ответ:
X=Наташа X=Даша 2 solutions
И, наконец, если надо получить ответ на вопрос: есть ли информация о людях, находящихся в отношении "мама - дочка", то его можно сформулировать в виде:
мама(_,_),
В данном случае нам не важны конкретные имена, а интересует, есть ли в нашей базе знаний хотя бы один соответствующий факт. Ответом в данном случае будет просто "Yes". Система сообщит о том, что у нее есть информация об объектах, связанных отношением "мама".
Введем в нашу программу правило, определяющее отношение "бабушка - внучка", в терминах "быть мамой":
бабушка(X,Y):- мама(X,Z), мама(Z,Y).
По сути дела здесь записано, что один человек является бабушкой другого, если это он является мамой его мамы. Конечно, для полноты картины не помешает записать еще и второе правило, которое говорит, что бабушка - это мама папы, если в программу добавить факты еще и про пап.
Заметим, что в нашей программе нет ни одного факта, связанного с отношением бабушка. Тем не менее, система оказывается способна найти ответы на вопросы о бабушках, пользуясь введенными фактами и правилом. Например, если нас интересует, чьей бабушкой является Наташа, то мы можем записать этот вопрос следующим образом:
бабушка("Наташа",X).
Для того чтобы найти ответ на вопрос, система просмотрит нашу базу сверху вниз, пытаясь найти предложение, в заголовке которого стоит предикат бабушка. Найдя такое предложение (это предложение бабушка(X,Y):-мама(X,Z),мама(Z,Y) ), система конкретизирует переменную из заголовка предложения X именем " Наташа ", переменную Y с переменной X из вопроса, после чего попытается достигнуть цели: мама("Наташа",Z) и мама(Z,Y). Для этого она просматривает базу знаний в поиске предложения, заголовок которого можно сопоставить с предикатом мама("Наташа",Z).
Это можно сделать, конкретизировав переменную Z именем "Даша". Затем система ищет предложение, в заголовке которого стоит предикат мама с первым аргументом "Даша" и каким-то именем в качестве второго аргумента. Подходящим предложением оказывается факт мама("Даша","Маша"). Система установила, что обе подцели мама("Наташа",Z) и мама(Z,Y) достижимы при Z="Даша", Y="Маша". Она выдает ответ:
X=Маша
Напомним, что наша переменная X из вопроса была связана с переменной Y из правила. После этого, если есть такая возможность, система пытается найти другие решения, удовлетворяющие вопросу. Однако в данном случае других решений нет.
Вообще говоря, цель может быть согласована, если она сопоставляется с заголовком какого-либо предложения. Если сопоставление происходит с фактом, то цель согласуется немедленно. Если же сопоставление происходит с заголовком правила, то цель согласуется только тогда, когда будет согласована каждая подцель в теле этого правила, после вызова ее в качестве цели. Подцели вызываются слева направо. Поиск подходящего для сопоставления предложения ведется с самого начала базы. Если подцель не допускает сопоставления, то система совершает возврат для попытки повторного согласования подцели. При попытке повторного согласования система возобновляет просмотр базы с предложения, непосредственно следующего за тем, которое обеспечивало согласование цели ранее.
В программе на Прологе важен порядок предложений внутри процедуры, а также порядок хвостовых целей в теле предложений. От порядка предложений зависит порядок поиска решений и порядок, в котором будут находиться ответы на вопросы. Порядок целей влияет на количество проверок, выполняемых программой при решении.