Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

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

Составные цели вы можете использовать для поиска решения, в котором

и подцель A и подцель B - истинны (конъюнкция) или в котором подцель A

либо подцель B - истинна (дизьюнкция). Ниже представлен пример программы,

иллюстрирующей эту мысль:

/* Программа CH03EX05.PRO */

predicates

car(symbol, real, integer, symbol, integer)

truck(symbol, real, integer, symbol, integer)

clauses

car(chrysler, 130000, 3, red, 12000).

car(ford, 90000, 4, gray, 25000).

car(datsun, 8000, 1, red, 30000).

truck(ford, 80000, 6, blye, 8000).

truck(datsun, 50000, 5, orange, 20000).

truck(toyota, 25000, 2, black, 25000).

Загрузите и запустите эту программу, а затем попробуйте ввести цель:

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

Данная цель попытается найти описанную в предложениях машину (car),

которая стоит ровно $25.000. Пролог ответит:

Make=ford, Odometer=90000, Years_on_road=4, Body=gray

1 Solution

Goal:_

Однако, данная цель явно неестественна, т.к. скорее всего вы хотите

спросить что-то типа:

"Есть ли в списке машина, стоящая меньше, чем $25.000?

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

цель:

car(Make, Odometer, Years_on_road, Body, Cost) /*Подцель A*/

and Cost < 25000. /*подцель B*/

Это и является конъюнкцией. Для разрешения этой составной цели Про-

лог будет пытаться по очереди решать подцели. Вначале, он попытается ре-

шить:

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

а затем

Cost < 25000.

с переменной Cost, имеющей идентичное значение в обеих подцелях. Теперь

попытайтесь сделать все это.

Замечание: подцель Cost < 25000 соответствует отношению (связи)

"меньше чем", которое встроено в систему Турбо Пролога. Отношение (связь)

"меньше чем" ничем не отличается от любой другой связи, использующей два

числовых объекта, однако, значительно естественнее использовать для его

обозначения символ "<", а не какое-то имя.

Помимо этого, вы можете использовать составную цель для определения

истинности одной из двух подцелей. На естественном языке вы можете спро-

сить:

В списке есть автомобиль, стоящий меньше чем $25.000, или

грузовик, стоимостью меньше $ 20.000?

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

го решения:

car(Make, Odometer, Years_on_road, Body, Cost) and

Cost < 25000 or /*Подцель A*/

truck(Make, Odometer, Years_on_road, Body, Cost) and

Cost < 20000 /*Подцель B*/

Этот тип составной цели и является дизъюнкцией. Данная цель устано-

вила две альтернативные подцели также, как если бы это были два предложе-

ния одного правила. Пролог будет искать все решения, удовлетворяющие обе-

им подцелям.

При разрешении такой составной цели Пролог, вначале, попытается ре-

шить первую подцель ("найти автомобиль..."), состоящую из следующих под-

целей:

car(Make, Odometer, Years_on_road, Body, Cost)

и

Cost < 25000.

Если автомобиль найдется - цель истинна; если нет - Пролог попытает-

ся разрешить вторую составную цель ("найти грузовик (truck)..."), состоя-

щую из подцелей:

truck(Make, Odometer, Years_on_road, Body, Cost),

и

Cost < 20000.

Соседние файлы в папке Документация