Теория:
База знаний в системе логического программирования делится на две части: описание фактов и описание правил вывода.
Как это делается, разберем на небольшом примере большой семьи. В этой семье есть:
- мама (ее имя Нина);
- папа (его имя Саша);
- сын (его имя Андрей);
- сын (его имя Павел);
- дочь (ее имя Вера);
- сестра мамы (ее имя Ирина);
- брат папы (его имя Юрий);
- брат папы (его имя Игорь);
- отец мамы (его имя Егор);
- мать мамы (ее имя Анна);
- отец папы (его имя Петр);
- мать папы (ее имя Софья);
- жена Андрея (ее имя Татьяна);
- дочь Андрея и Татьяны (ее имя Мария);
- муж Веры (его имя Антон);
- сын Веры и Антона (его имя Виктор).
Остановимся на этом. Видно, что здесь присутствуют следующие отношения:
- быть_отцом \((x,y)\),
- быть_ сыном \((x,y)\),
- быть_братом \((x,y)\),
- быть мужем \((x,y)\)
- быть_матерью \((x,y)\),
- быть_дочерью \((x,y)\),
- быть_сестрой \((x,y)\),
- быть_женой \((x,y)\).
Каждому из этих отношений соответствует предикат, который принимает значение Истина в том и только в том случае, если значения его переменных таковы, что соответствующие им объекты (в нашем случае — субъекты) находятся в данном отношении. Например, если предикат, соответствующий отношению быть_отцом \((x,y)\), обозначить как Father\((x,y)\), то Father(Саша, Андрей) = Истина, а Father(Саша, Мария) = Ложь. Введем нужные нам предикаты:
- быть_отцом \((x,y)\) — Father\((x,y)\)
- быть_матерью \((x,y)\) — Mother\((x,y)\)
- быть сыном \((x,y)\) — Son\((x,y)\)
- быть_дочерью \((x,y)\) — Daughter\((x,y)\)
- быть братом \((x,y)\) — Brother\((x,y)\)
- быть_сестрой \((x,y)\) — Sister\((x,y)\)
- быть_мужем \((x,y)\) — Husband\((x,y)\)
- быть_женой \((x,y)\) — Wife\((x,y)\)
Известная нам информация
- Father(Саша, Андрей);
- Father(Саша, Павел);
- Father(Саша, Вера);
- Son(Андрей, Нина);
- Son(Андрей, Саша);
- Son(Павел, Нина);
- Son(Павел, Саша);
- Father(Егор, Нина);
- Father(Петр, Саша);
- Husband(Антон, Вера);
- Son(Виктор, Вера);
- Sоn(Виктор, Антон);
- Sister(Ирина, Нина);
- Mother(Нина, Андрей);
- Mother(Нина, Павел);
- Mother(Нина, Вера);
- Daughter(Вера, Нина);
- Daughter(Вера, Саша);
- Brother(Юрий, Саша);
- Brother(Игорь, Саша);
- Mother(Анна, Нина);
- Mother(Лидия, Саша);
- Wife(Татьяна, Андрей);
- Daughter(Мария, Андрей);
- Daughter(Мария, Татьяна).
Это факты нашей базы знаний. А теперь запишем правила. Вот первое: .
В переводе на обычный язык это правило означает: если \(x\) — папа для некоторого \(z\) и тот же \(z\) — папа для \(y\), то \(x\) — дедушка для \(y\). На языке логики предикатов то же самое запишется так: .
Как видите, вместо знака конъюнкции пишется запятая, вместо импликации пишется знак присваивания, причем правая и левая части поменялись местами.
Предикат, стоящий в левой части правила, называется головой правила, а предикаты, стоящие в правой части, образуют тело правила.
А вот с кванторами немного сложнее. В языке Пролог кванторы не пишутся, а только подразумеваются. При этом если переменные встречаются в голове правила, то к ним применяются кванторы всеобщности, а если переменные встречаются только в теле правила, то к ним применяются кванторы существования. У многих, наверно, возник недоуменный вопрос: ведь дедушка — это не только папин папа, но и мамин папа. На языке предикатов это записывается так:
.
Иными словами, нам нужна операция дизъюнкции. А ее в правилах Пролога нет. Давайте вспомним, как обошлись с дизъюнкцией разработчики СУБД Access. Очень просто: разнесли в разные строки запрашиваемые параметры. Также и в Прологе: предикаты, соединенные дизъюнкцией, разносятся в разные правила. Значит, мы должны просто записать еще одно правило:
.
Теперь, когда все условности оговорены, мы будем записывать все утверждения по правилам Пролога. Можно, к примеру, определить предикат, соответствующий отношению быть_бабушкой или отношению быть_внуном. Совокупность правил, которые вы здесь напишете, и создает «интеллектуальную» начинку разрабатываемой базы знаний в «Семья».
Теперь, когда все условности оговорены, мы будем записывать все утверждения по правилам Пролога. Можно, к примеру, определить предикат, соответствующий отношению быть_бабушкой или отношению быть_внуном. Совокупность правил, которые вы здесь напишете, и создает «интеллектуальную» начинку разрабатываемой базы знаний в «Семья».
Источники:
Гейн А. Г., Ливчак А. Б., Сенокосов А. И. Информатика и ИКТ. 10 класс. М. : Просвещение, 184 с.