На этом шаге мы рассмотрим предложения.
Ранее мы говорили о фактах и правилах, отношениях, основных конструкциях и запросах. Все эти термины являются частью логики и естественного языка. Сейчас мы будем обсуждать те же понятия, но используя термины Пролога, - предложения, предикаты, переменные и цели.
По сути, есть только два типа фраз, составляющих язык Пролог: фраза может быть либо фактом, либо правилом. Эти фразы в Прологе известны под термином предложения (clause). Сердце программ на Прологе состоит из предложений.
Подробнее о фактах. Факт представляет либо свойство объекта, либо отношение между объектами. Факт самодостаточен. Прологу не требуется дополнительных сведений для подтверждения факта, и факт может быть использован как основа для логического вывода.
Подробнее о правилах. В Прологе, как и в обычной жизни, можно судить о достоверности чего-либо, логически выведя это из других фактов. Правило - это конструкция Пролога, которая описывает, что можно логически вывести из других данных. Правило - это свойство или отношение, которое достоверно, когда известно, что ряд других отношений достоверен. Синтаксически эти отношения разделены запятыми.
Рассмотрим несколько примеров работы с правилами.
1. Пример, иллюстрирующий правило, которое может быть использовано для того, чтобы сделать вывод, подходит ли некоторое блюдо из меню Диане:
Диана - вегетарианка и ест только то, что говорит ей ее доктор. (Diane is a vegetarian and eats only what her doctor tells her to eat)
Зная меню и предыдущее правило, вы можете сделать вывод о том, выберет ли Диана данное блюдо. Чтобы выполнить это, вы должны проверить, соответствует ли блюдо заданному ограничению:
В Прологе подобное отношение должно быть выражено правилом, т. к. вывод основан на фактах. Вот один вариант записи правила:
diane_can_eat(Food_on_menu):- vegetable(Food_on_menu), on_doctor_list(Food_on_menu).
2. Предположим, что вам хотелось бы записать факт, который истинен, если Person1 является родителем Person2. Нужный факт выглядит так:
parent(paul,samantha).
Этот факт обозначает, что Пол - родитель Саманты. Но, предположим, что в базе данных фактов Пролога есть факты, формулирующие отношение отцовства. Например, "Пол - отец Саманты":
father(paul,samantha).
Пусть у вас также есть факты, формулирующие отношение материнства, например, "Джулия - мать Саманты":
mother(julie,samantha).
Если у вас уже есть несколько фактов, формулирующих отношения отцовства/материнства, то не стоит тратить время на запись факта родства в базу данных фактов для каждого отношения родства.
Так как вы знаете, что Person1 - родитель Person2, если Personl - отец Person2 или Person1 - мать Person2, то почему бы не записать правило, объединяющее эти ограничения? После формулирования этих условий на естественном языке достаточно просто записать их в правило Пролога.
parent(Person1,Person2):- father(Person1,Person2). parent(Person1,Person2):- mother(Person1,Person2).
Эти правила Пролога говорят, что
Person1 является родителем Person2, если Person1 является отцом Person2.
и
Person1 является родителем Person2, если Person1 является матерью Person2.
3. Вот другой пример:
Человек может купить машину, если машина ому нравится (likes), и если машина продается (for sale).
Это отношение может быть переведено на язык Пролог следующим правилом:
can_buy(Name,Model):- person(Name), car(Model), likes(Name,Model), for_sale(Model).
Name может купить (can_buy) Model,
если Name является человеком (person),
и Model является машиной (саr),
и Name нравится (likes) Model,
и Model продается (for_sale).
Это правило будет истинным, если истинны все 4 условия в теле правила.
На следующем шаге мы рассмотрим предикаты.