Шаг 16.
Основы логического программирования.
Цели (запросы)

    На этом шаге мы рассмотрим цели.

    До сих пор мы, говоря о вопросах, задаваемых Прологу, употребляли слово "запрос". Далее мы будем использовать более общее слово "цель". Трактовка запросов как целей такова: когда вы даете Прологу запрос, в действительности вы даете ему цель для выполнения. ("Найди ответ на вопрос, если он существует: ...")

    Цели могут быть или простыми:

   likes(ellen,swimming). 
   likes(bill,What).
или более сложными. Например цель из двух частей:

   likes (Person,reading),
   likes (Person,swimming).

    Цель, состоящая из двух и более частей, называется сложной целью, а каждая часть сложной цели называется подцелью.

    Часто бывает нужно найти общее решение двух целей. Например, в предыдущем примере о родителях вы могли бы поинтересоваться, которые из родителей являются родителями мужского пола. Искать решение для такого запроса можно, задав сложную цель.

Составные цели: конъюнкция и дизъюнкция

    Как вы уже видели, составные цели можно использовать для поиска решения, в котором обе подцели А и В истинны (конъюнкция), разделяя подцели запятой. Вы также можете искать решения в том случае, если истинна либо подцель А, либо подцель В (дизъюнкция), разделяя подцели точкой с запятой. Ниже представлен пример программы pro16_1.pro, иллюстрирующей эту идею.

   predicates
      car(symbol,real,integer,symbol,real)
      truck(symbol,real,integer,symbol,real)
      vehicle(symbol,real,integer,symbol,real)
   clauses
      car(Chrysler,130000,3,red,12000).
      car(ford,90000,4,gray,25000).
      car(datsun,8000,1,red,30000).
      truck(ford,80000,6,blue,0000).
      truck(datsun,50000,5,orange,20000). 
      truck(toyota,25000,2,black,25000).
      vehicle(Make,Odometer,Age,Color,Price):-
         car(Make,Odometer,Age,Color,Price);
         truck(Make,Odometer,Age,Color,Price).
Текст этой программы можно взять здесь.

    Введите цель:

   car(Make,Odometer,Years_on_road,Body,25000).

    Данная цель попытается найти описанную в предложениях машину (саr), котора стоит ровно $25 000. Пролог ответит:

   Make=ford, 
   Odometer=90000,
   Years_on_road=4,
   Body=gray 
   1 решение

    Однако данная цель несколько неестественна, т.к. скорее всего будет задан вопрос типа:

    Есть ли в списке машина, стоящая меньше, чем $25000? (Is there a car listed that costs less than $25000?)

    Для поиска такого решения вы можете задать следующую составную цель:

   car(Make, Odometer,Years_on_road,Body,Cost), % подцель А
и
   Cost  < 25000. % подцель  В

    Это и является конъюнкцией. Для разрешения этой составной цели Пролог будет пытаться по очереди решать подцели. Вначале он попытается решить:

   car(Make,Odometer,Years_on_road,Body,Cost).
а затем
   Cost  <  25000.
с переменной Cost, имеющей идентичное значение в обеих подцелях.


    Замечание: Подцель cost < 25 000 соответствует отношению "меньше чем", которое встроено в систему Пролога. Отношение "меньше чем" ничем не отличается от любого другого отношения, использующего два числовых объекта, но правильнее применять для его обозначения символ (<), помещая его между двумя объектами.

    Посмотрим, является ли истенным следующее выражение, на естественном языке оно звучит так:

    Есть ли в списке автомобиль, стоимостью меньше $25000, или грузовик стоимостью меньше $20000?

    При задании следующей составной цели Пролог выполнит поиск требуемого решения:

   car(Make,Odometer,Years_on_road,Body,Cost), 
   Cost  < 25000  % подцель А
или
   truck(Make,Odometer,Years_on_road,Body,Cost),
   Cost < 20000. % подцель  В

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

   car(Make,Odometer,Years_on_road,Body,Cost)
и
   Cost  <  25000.

    Если автомобиль найдется - цель истинна; если нет - Пролог попытается разрешить вторую составную цель ("найти грузовик..."), состоящую из подцелей:

   truck(Make,Odometer,Years_on_road,Body,Cost),
и
   Cost  <  20000.

    На следующем шаге мы начнем рассматривать комментарии.




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