Шаг 10.
Основы логического программирования.
Факты и правила

    На этом шаге мы рассмотрим факты и правила.

    Программист на Прологе описывает объекты (objects) и отношения (relations), а затем описывает правила (rules), при которых эти отношения являются истинными. Например, предложение

    Билл любит собак. (Bill likes dogs.)
устанавливает отношение между объектами Bill и dogs (Билл и собаки); этим отношением является likes (любит). Ниже представлено правило, определяющее, когда предложение "Билл любит собак" является истинным:

    Билл любит собак, если собаки хорошие. (Bill likes dogs if the dogs are nice.)

Факты

    В Прологе отношение между объектами называется фактом (fact). В естественном языке отношение устанавливается в предложении. В логике предикатов, используемой Прологом, отношение соответствует простой фразе (факту), состоящей из имени отношения и объекта или объектов, заключенных в круглые скобки. Как и предложение, факт завершается точкой (.).

    Ниже представлено несколько предложений на естественном языке с отношением "любит" (likes):

    Билл любит Синди. (Bill likes Cindy)
    Синди любит Билла. (Cindy likes Bill)
    Билл любит собак. (Bill likes dogs)

    А теперь перепишем ли же факты, используя синтаксис Пролога:

   likes (bill,cindy). 
   likes(cindy,bill). 
   likes(bill,dogs).

    Факты, помимо отношений, могут выражать и свойства. Так, например, предложения естественного языка "Kermit is green" (Кермит зеленый) и "Caitlin is girl" (Кейтлин - девочка) на Прологе, выражая те же свойства, выглядят следующим образом:

   green(kermit). 
   girl(caitlin).

Правила

    Правила позволяют вам вывести один факт из других фактов. Другими словами, можно сказать, что правило - это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными. Ниже представлены правила, соответствующие связи "любить" (likes):

    Синди любит все, что любит Билл. (Cindy likes everything that Bill likes)
    Кейтлин любит все зеленое. (Caitlin likes everything that is green)

    Используя эти правила, вы можете из предыдущих фактов найти некоторые вещи, которые любят Синди и Кейтлин:

    Синди любит Синди. (Cindy likes Cindy)
    Кейтлин любит Кермит. (Caitlin likes Kermit)

    Чтобы перевести эти правила на Пролог, вам нужно немного изменить синтаксис, подобно этому:

   likes(cindy,Something):-  
      likes(bill,Something).
   likes(caitlin,Something):-  
      green(Something).

    Символ :- имеет смысл "если", и служит для разделения двух частей правила: заголовка и тела.

    Вы можете рассматривать правило и как процедуру. Другими словами, эти правила

   likes(cindy,Something):-  
      likes(bill,Something)
   likes(caitlin,Something):- 
      green(Something).

также означают: "Чтобы доказать, что Синди любит что-то, докажите, что Билл любит это" и "Чтобы доказать, что Кейтлин любит что-то, докажите, что это что-то зеленое". С такой "процедурной" точки зрения правила могут "попросить" Пролог выполнить другие действия, отличные от доказательств фактов, - такие как напечатать что-нибудь или создать файл.

Запросы

    Однократно дав языку Пролог несколько фактов, мы можем задавать вопросы, касающиеся отношений между ними. Это называется запросом (query) системы языка Пролог. Мы можем задавать Прологу такие же вопросы, которые мы могли бы дать вам об этих отношениях. Основываясь на известных, заданных ранее правилах, вы можете ответить на вопросы об этих отношениях, в точности это может сделать Пролог.

    На естественном языке мы спрашиваем:

    Does Bill like Cindy? (Билл любит Синди?)

    По правилам Пролога мы спрашиваем:

   likes(bill,cindy). 

    Получив такой запрос, Пролог мог бы ответить:

   yes   (да)

потому что Пролог имеет факт, подтверждающий, что это так. Немного усложнив вопрос, мы могли бы спросить вас на естественном языке:

    What does Bill like? (Что любит Билл?)

    По правилам Пролога мы спрашиваем:

   likes(bill,What).

    Заметим, что синтаксис Пролога не изменяется, когда вы задаете вопрос: этот запрос очень похож на факт. Впрочем, важно отметить, что второй объект начинается с большой буквы, тогда как первый объект - bill - нет. Это происходит потому, что bill - фиксированный, постоянный объект - известная величина, a What - переменная. Переменные всегда начинаются с заглавной буквы или символа подчеркивания.

    Пролог всегда ищет ответ на запрос, начиная с первого факта, и перебирает факты, пока они не закончатся. Получив запрос о том, что Билл любит, Пролог ответит:

   What=cindy
   What=dogs 

    Так как ему известно, что

    likes(bill, cindy).
   
и
    likes(bill, dogs).

    Надеемся, что вы пришли к такому же выводу.

    Если бы мы спросили вас (и Пролог):

    What does Cindy like? (Что любит Синди?)

   likes(cindy, What).
то Пролог ответил бы:
   What = bill  
   What = cindy
   What = dogs

поскольку Пролог знает, что Синди любит Билла, и что Синди любит то же, что и Билл, и что Билл любит Синди и собак.

    Мы могли бы задать Прологу и другие вопросы, которые можно задать человеку. Но вопросы типа "Какую девушку любит Билл?" не получат решения, т.к. Прологу в данном случае не известны факты о девушке, а он не может вывести заключение, основанное на неизвестных данных: в этом примере мы не дали Прологу какого-нибудь отношения или свойства, чтобы определить, являются ли какие-либо объекты девушками.

    На следующем шаге мы рассмотрим размещение фактов, правил и запросов.




Предыдущий шаг Содержание Следующий шаг