Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пз ответы.docx
Скачиваний:
8
Добавлен:
05.08.2019
Размер:
128.41 Кб
Скачать
  1. Специальные предикаты: fail,!.

Применение стандартного предиката ТП "отсечение"(cut или !) позволяет добиться следующих двух преимуществ: - повышение эффективности Пролог-программы за счет сокращения перебора (прекращения дальнейшего поиска по дереву решений после получения первого варианта ответа); - повышение выразительности Пролог-программы за счет использования правил-ветвлений (if...then...else). Первое преимущество рассматривалось в лабораторной работ N1. Второе можно пояснить на следующем примере. В логическом программировании очень часто встречаются взаимоисключающие правила. В процедурных языках подобная ситуация описывается при помощи операторов ветвления. В языках логического программирования операторы отсутствуют. Поэтому появляется необходимость в наличии стандартного приема формализации подобной ситуации через правила. Для этих целей используется предикат cut. Например, простейший оператор ветвления

if Q(x) then P(a) else P(b)

на Прологе может быть реализован в виде следующего правила:

P(a):-Q(x),! P(b).

Более сложная конструкция вложенных операторов ветвления тоже достаточно просто реализуется на Прологе. Например, операторы ветвления:

if Q(x) then P(a) else if R(x) then P(b) else if T(x) then P(c) else P(d)

на Прологе будет описываться следующим правилом:

P(a):-Q(x),!. P(b):-R(x),!. P(c):-T(x),!. P(d).

Подобные правила встречаются при классификации объектов в Пролог-программах.

Предикат "ложь". В Прологе имеется встроенный пре­дикат "fail", который всегда указывает на ложь, т.е. на тупик в процессе анализа целей. Этот предикат полезен в том случае, когда необходимо получить все решения некоторой более ран­ней цели, прежде чем переходить к анализу последующих це­лей (обычно Пролог находит первое решение первой цели, а затем последующих целей). Вопрос заключается в том, как пройти к последующим целям, если предикат "fail" системати­чески осуществляет возврат. Например, на запрос отец(Х,Y), write(X,Y), nl, fail, мать(Z,Y). высвечиваются имена всех отцов и нет возможности достичь предиката "мать". Это можно сде­лать с помощью логической операции ИЛИ, используя кото­рую можно сказать: ИЛИ имеется следующий факт "отец" ИЛИ осуществляется переход к следующей цели". Отсечения часто используются в комбинации с предикатом fail. Например, следующее правило определяет предикат, истинный в том случае, если его аргументы представляют собой различные объекты:

different(X,Y) :- X=Y,!,fail;true.

Комбинация "!,fail" имеет следующий процедурный смысл: "прекра- тить" продвижение по текущей ветви дерева поиска и перейти к поиску по другим ветвям. В определении правила используется стандартный предикат ТП true, который всегда имеет значение ИСТИНА. Наряду с преимуществами при применении отсечения в Пролог- программе могут возникнуть сложности, связанные с процедурной семантикой языка. Дело в том, что в отдельных случаях применение отсечения связанно с определенным порядком предложений в тексте программы (например, в случае взаимоисключающих правил). Изме- нение порядка предложений может повлиять на результат работы программы.