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

8.2. Использование отсечения

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

Пример 8.1. Устранение бесконечных циклов. Вновь обратимся к утверждениям, определяющим последовательность Фибоначчи (см. гл. 4)

Фиб(0,_,1).

Фиб(1,1,1).

Фиб(N,F1,F2) :-

М is N-1,

Фиб(М,F0,F1),

F2 is F0+Fl.

Выдав запрос

?- Фиб(0,_,F2).

получим:

F2=1

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

Если мы ответим «да», то Пролог сделает попытку сопоставить с за­просом второй факт и потерпит неудачу. Однако сопоставление голо­вы третьего утверждения с запросом происходит успешно и осущест­вляется попытка доказать цель Фиб(-1,F0,F1), что в свою очередь приводит к цели Фиб(-2,..,..) и так далее, т.е. образуется бесконеч­ный цикл.

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

Фиб(0,_,1) :- !.

Фиб(1,1,1) :- !.

Фиб(N,F1,F2) :-

М is N-1,

Фиб(М,F0,F1),

F2 is F0+F1.

Учитывая данное определение Фиб и задав вопрос

?- Фиб(0,_,F2).

получим:

F2=1

На дополнительный запрос

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

Пролог даст ответ

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

Пример 8.2. Программирование взаимоисключающих утверж­дений. Напишем целевое утверждение, которое рассматривает в ка­честве аргумента экзаменационную оценку студента в интервале от 0 до 100 и определяет степень согласно следующим критериям:

Критерий Степень

Оценка > = 80 A

80 > Оценка > = 60 B

60 > Оценка > = 40 C

40 > Оценка D

Запишем данные условия на Прологе, не применяя отсечение:

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

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

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

степень(M,'D') :- М < 40.

Теперь разберем процесс доказательства запроса

?-стенень,(50,6).

при G = 'С'.

Голова первого утверждения сопоставляется с запросом, но Про­лог терпит неудачу при доказательстве тела утверждения: 50 >= 80. Поэтому первое утверждение не может быть согласовано. Пролог пы­тается доказать второе утверждение. Его голова сопоставляется с целью, проверка условия 50 < 80 осуществляется успешно, но про­верка второго условия в теле: 50 >= 60, заканчивается неудачей. Про­лог переходит к доказательству третьего утверждения. Его голова со­поставляется с целью, и на этот раз проверка условия в теле также завершается успешно, если G принимает значение С.

Обратим внимание на следующий момент. Доказательство пер­вого утверждения заканчивается неудачей из-за того, что не выпол­няется условие М >= 80. Однако при рассмотрении второго утвержде­ния все же будет осуществляться проверка М < 80, хотя результат данного сравнения вытекает из неудачи доказательства первого ут­верждения. Аналогично в третьем утверждении проверяется условие М < 60, хотя оно следует из неудачи доказательства второго утверж­дения. Такое дублирование проверок приводит к неэффективности работы программы.

Если мы опустим перекрывающиеся условия, то определение процедуры примет вид:

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

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

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

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

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