Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

Обратившись к системе с запросом

?- оценка(90,G).

узнаем верный ответ

G='А'

другие решения (да/нет) ? да

Ответив «да», получим дополнительные решения:

G='B'

другие решения (да/нет) ? да

G='C'

другие решения (да/нет) ? да

G='D'

Для устранения альтернативных решений введем отсечение:

степень(М,'A') :- М >= 80,!.

степень(М,'В') :- М >= 60,!.

степень(М,'С') :- М >= 50,!.

степень(М,'D').

При таком определении процедуры на запрос:

?-оценка (90,G).

получим:

G='А'

другие решения (да/нет) ? да

Ответ «да» приведет к результату:

Других решений нет

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

Пример 8.3. Неудачное завершение доказательства цели. В при­мере 8.2 мы предполагали, что оценка находится в правильном диа­пазоне. Задав вопрос программе

?- степень(900,G).

получим ответ:

G='A'.

Допустим, что выполнение процедуры степень закончится неу­дачей, если оценка не принадлежит ожидаемому интервалу. Мы мо­жем добиться этого, расширив описание первого и последнего утвер­ждений:

степень(М,'А') :- М >= 80,!,М <= 100.

степень(М,'В') :- М >= 60,!.

степень(М,'С') :- М >= 50,!.

степень(М,'D') :- М >= 0.

Другой вариант решения заключается в том, чтобы ввести в ут­верждение случай возникновения неудачи, используя комбинацию отсечение - fail.

степень(М,_) :- (М < 0; М > 100),!,fail.

степень(М,'А') :- М >= 80,!.

степень(М,'В') :- М >= 60,!.

степень(М,'С') :- М >= 40,!.

степень(М.'D').

Зададим вопрос:

?-степень(900,G).

имея в виду приведенное определение процедуры. Сначала произой­дет сопоставление запроса с головой первого утверждения. Цель (М<0; М>100) будет достигнута. Затем будет доказана цель-отсечение. Но когда встретится предикат fail, стоящий перед ним предикат отсечение остановит работу механизма возврата, и в результате от­ветом на запрос будет «нет».

Преимущество введения предиката fail заключается в том, что выделяются случаи, когда доказательство утверждений должно за­кончиться неудачей, и проясняется смысл остальных утверждений.

8.3. Ловушки отсечения

При использовании отсечения возможно возникновение двух ви­дов ловушек:

а) отсечение исключает необходимые альтернативы;

б) отсечение разрушает декларативное восприятие программы.

В качестве примера ловушки первого типа рассмотрим примене­ние предиката присоединить (разл. 5.1.2) для разделения списка:

присоединить([],Q,Q).

присоединить[HP | ТР],Q,[HP | TR]) :-

присоединить (TP,Q,TR).

Запрос

?- присоединить(X,Y,[a,b,c,d]).

приведет к

X=[]

Y=[a,b,c,d]

другие решения (да/нет)? да

Х=[а]

Y=[b,c,d]

другие решения (да/нет)? да

Х=[а,b]

Y=[c,d]

и так далее.

Введем отсечение в граничное условие предиката присоединить:

присоединить([],Q,Q) :-!.

присоединить([НP | TP],Q,[HP | TR]) :-

присоединить(TP,Q,TR).

тогда в результате запроса

?- присоединить([a,b],[c,d],L).

будет определено значение

L=[a,b,c,d].

Ответом на запрос

?- присоединить(Х,Y,[a,b,c,d].

будет

Х=[]

Y=[a,b,c,d]

Однако мы не получим альтернативных разбиений:

другие решения (да/нет)? да

Других решений нет

Пример 8.2 иллюстрирует ту ситуацию, когда введение отсече­ния приводит к потере декларативности утверждения.

При определении процедуры степень без использования отсече­ния некоторое утверждение, скажем, второе, читается следующим образом: «степень принимает значение В, если оценка больше или равна 60, но меньше 80». В случае с отсечением декларативное восп­риятие утверждения: «степень принимает значение В, если оценка больше 60», неверно, так как оценка 90 также удовлетворяет усло­вию.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]