На этом шаге мы рассмотрим цели.
До сих пор мы, говоря о вопросах, задаваемых Прологу, употребляли слово "запрос". Далее мы будем использовать более общее слово "цель". Трактовка запросов как целей такова: когда вы даете Прологу запрос, в действительности вы даете ему цель для выполнения. ("Найди ответ на вопрос, если он существует: ...")
Цели могут быть или простыми:
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.
Посмотрим, является ли истенным следующее выражение, на естественном языке оно звучит так:
Есть ли в списке автомобиль, стоимостью меньше $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.
На следующем шаге мы начнем рассматривать комментарии.