Программирование на языке Пролог для искусственного интеллекта
Шрифт:
В качестве дальнейшего расширения нашей программы-примера давайте введем отношение
Однако это отношение можно определить значительно элегантнее, использовав тот факт, что оно обратно отношению
Для всех X и Y
Y является отпрыском X, если
X является родителем Y.
Эта формулировка уже близка к формализму, принятому в Прологе. Вот соответствующее прологовское предложение, имеющее тот же смысл:
Это предложение можно прочитать еще и так:
Для всех X и Y,
если X — родитель Y, то
Y — отпрыск X.
Такие предложения Пролога, как
называются правилами. Есть существенное различие между фактами и правилами. Факт, подобный факту
это нечто такое, что всегда, безусловно истинно. Напротив, правила описывают утверждения, которые могут быть истинными, только если выполнено некоторое условие. Поэтому можно сказать, что правила имеют
• условную часть (правая половина правила) и
• часть вывода (левая половина правила).
Вывод называют также головой предложения, а условную часть — его телом. Например:
Если условие
На приведенном ниже примере проследим, как в действительности правила используются Прологом. Спросим нашу программу, является ли Лиз отпрыском Тома:
В программе нет фактов об отпрысках, поэтому единственный способ ответить на такой вопрос — это применить правило о них. Правило универсально в том смысле, что оно применимо к любым объектам X и Y, следовательно, его можно применить и к таким конкретным объектам, как
После конкретизации мы получаем частный случай нашего общего правила. Вот он:
Условная часть приняла вид:
Теперь пролог-система попытается выяснить, выполняется ли это условие (является ли оно истинным). Для этого исходная цель
заменяется подцелью
Эта (новая) цель достигается тривиально, поскольку такой факт можно найти в нашей программе. Это означает, что утверждение, содержащееся в выводе правила, также истинно, и система ответит на вопрос
Добавим теперь в нашу программу-пример еще несколько родственных отношений. Определение отношения
Для всех X и Y
X является матерью Y, если
X является родителем Y и
X — женщина.
На Пролог это переводится в виде такого правила:
Запятая между двумя условиями указывает на конъюнкцию условий. Это означает, что они должны быть выполнены оба одновременно.
Рис. 1.3. Графы отношений
Такие отношения как
Здесь уместно сделать несколько замечаний о внешнем виде нашей программы. Пролог дает почти полную свободу расположения текста на листе. Так что можно вставлять пробелы и переходить к новой строке в любом месте текста по вкусу. Вообще мы хотим сделать так, чтобы наша программа имела красивый и аккуратный вид, а самое главное, легко читалась. Для этого мы часто будем помещать голову предложения и каждую цель на отдельной строке. При этом цели мы будем писать с отступом, чтобы сделать разницу между головой и целями более заметной. Например, правило
На рис. 1.4 показано отношение
Для любых X и Y
X является сестрой Y, если
(1) у X и Y есть общий родитель, и
(2) X — женщина.
Рис. 1.4. Определение отношения
Граф на рис. 1.4 можно перевести на Пролог так: