Программирование на языке пролог
Шрифт:
4. Теперь Пролог ищет в базе данных факт родители(эдуард,виктория,альберт),так как из запроса нам известно, что Y– это эдуард,а из предыдущего шага мы знаем, что Mи Fобозначают викторияи альберт.Эта цель достигается, поскольку найден подходящий факт (пятое утверждение сверху). Так как это последняя цель в конъюнкции, то и полное целевое утверждение является согласованным с базой данных, и тем самым доказано, что факт является_сестрой(алиса, эдуард)является истинным, Пролог отвечает да.
Предположим, мы хотим знать, является ли Алиса чьей-либо сестрой. Соответствующий вопрос на Прологе имеет вид
?-
В ответ на вопрос Пролог выполняет следующие действия:
1. Вопрос сопоставляется с заголовком единственного правила для предиката является_сестрой.Переменная X, входящая в это правило, конкретизируется значением алиса.Так как переменная Xв запросе неконкретизирована, то и переменная Yв правиле также будет неконкретизированной. Однако эти две переменные теперь становятся сцепленными.Как только одной из переменных присваивается некоторое значение, другая переменная становится конкретизированной тем же самым значением. Конечно, в данный момент они неконкретизированы.
2. Первая цель – женщина(алиса),которая достигается так же, как и в предыдущем примере.
3. Вторая цель – родители(алиса,М,F).Эта цель сопоставляется с родители(алиса,виктория,альберт).Переменные Mи Fстановятся конкретизированными.
4. Так как переменная Yпока неизвестна, то третьей целью будет родители(Y,виктория,альберт),и она сопоставляется с родители(эдуард, виктория,альберт).Переменная Yконкретизируется значением эдуард.
5. Так как все целевые утверждения согласованы с базой данных, то тем самым согласовано и правило в целом, при этом переменная X(как известно из вопроса) равна алисаи Yравна эдуард.Учитывая, что Y(в правиле) является сцепленнойс X(в вопросе), то Xтакже конкретизирована значением эдуард.Пролог печатает Х=эдуард.
Как обычно, Пролог ожидает, пока вы сообщите ему, хотите ли вы найти все ответы на вопрос. Оказывается, что на данный вопрос имеется более одного ответа. Как Пролог находит оставшиеся ответы (ответ), является содержанием упражнения, приведенного в конце главы.
Как мы видели до сих пор, существуют два способа предоставить Прологу информацию относительно предиката, подобного предикату нравится.Мы можем сделать это, используя как факты, так и правила. В общем случае предикат будет определен смесью фактов и правил. Эти факты и правила, определяющие предикат, называются утверждениями [4] .Мы будем использовать слово утверждениев случаях, когда мы ссылаемся либо на факт, либо на правило.
4
В оригинале – clause for a predicate – термин, определяющий конъюнкты предиката, переменные которых связаны квантором общности. Связь этого понятия с математической логикой обсуждается в гл. 10.- Прим. ред.
В качестве следующего примера, на этот раз не имеющего отношения к монархам, рассмотрим правило: Человек может украсть что-либо, если этот человек вор и ему нравится вещь и эта вещь является ценной.На Прологе это записывается следующим образом:
может_украсть(P,T:- вор(P), нравится(P,T), ценный(T).
Предикат может_украсть,который имеет две переменные Pи T, представляет отношение: некоторый человек P может украсть вещь T. Это правило зависит от утверждений, определяющих предикаты вор, нравитсяи ценный.Они могут быть представлены либо как факты, либо как правила в зависимости от того, что является более подходящим. Например, рассмотрим следующую базу данных, составленную в том числе из утверждений, обсуждавшихся ранее. Мы добавим к ним номера утверждений, заключенные между специальными скобками /*… */. Именно таким образом в Пролог-системе записывается комментарий.Комментарии игнорируются Пролог-системой, но мы можем добавить их в программу для удобства. В последующем обсуждении мы будем ссылаться на номера предложений, представленные в виде комментариев.
/*1*/ вор(джон).
/*2*/ нравится(мэри, пища).
/*3*/ нравится(мэри,вино).
/*4*/ нравится(джон,X):- нравится(X,вино).
/*5*/ может_украсть(X,Y):- вор(X), нравится(X,Y).
Отметим, что определение предиката нравитсясодержит три отдельных утверждения: два факта и правило. Для Пролога это не имеет значения. Единственное различие состоит в том, что когда осуществляется поиск в базе данных, чтобы согласовать с ней некоторую цель, то правило вызывает дальнейший поиск, чтобы согласовать его собственные предикаты-подцели. Факт не имеет подцелей, так что при сопоставлении сфактом поиск либо сразу завершается, либо сразу происходит переход к следующему утверждению. Например, давайте проследим за тем, что получится, если обратиться к Прологу с вопросом: Что Джон может украсть?Прежде всего этот вопрос транслируется на Прологе:
?- может_украсть(джон,Х).
Чтобы ответить на этот вопрос, Пролог осуществляет поиск следующим образом:
1. Прежде всего Пролог ищет в базе данных утверждение, описывающее предикат может_украсть,и находит такое утверждение. Оно представлено в виде правила и имеет номер 5. Пролог отмечает это место в базе данных. Так как это утверждение является правилом, то, чтобы установить, согласуется ли заголовок правила с базой данных, необходимо попытаться согласовать с ней тело правила. Тогда переменной Xв правиле 5 присваивается значение джон,которое берется из вопроса. Как и в предыдущих примерах, мы должны сопоставить неконкретизированные переменные ( Xв вопросе и Yв правиле), так что теперь они будут сцеплены.Если вы не уверены, что до конца понимаете, что это значит, то необходимо вернуться назад к примерам с предикатом я вляется_сестрой(X, Y). Для того чтобы правило выполнилось, необходимо согласовать цели с базой данных. Таким образом, теперь проверяется на согласованность с базой данных первое утверждение вор(джон).
2. Эта цель достигается, так как факт вор(джон)содержится в базе данных (утверждение 1). Пролог отмечает это место в базе данных, и при этом присвоения значений переменным не происходит. Далее Пролог пытается достигнуть вторую цель, применяя утверждение 5. Так как X, как и ранее, обозначает джон,то теперь Пролог ищет нравится (джон, Y).Заметим, что к этому моменту Yостается неконкретизированной.
3. Цель нравится(джон, Y)сопоставляется с заголовком правила (утверждение 4). Переменная Y, входящая в цель, сцепляетсяс Xв заголовке правила, и обе эти переменные остаются неконкретизированными. Чтобы доказать это правило, теперь ищется нравится(Х, вино).
4. Эта цель достигается, так как она сопоставляется с нравится (мэри,вино)– фактом, являющимся утверждением с номером 3. Так что теперь Xстановится мэри.
5. Так как цель в утверждении 4 достигнута, то согласовано и правило в целом. Факт нравится(джон, мэри)следует из утверждения 4, так как переменная Yв утверждении 5 сцеплена с X, и ей тоже присваивается значение мэри.