- •Направления развития ии.
- •Данные и знания. Основные понятия.
- •Правила продукции. Достоинства и недостатки модели.
- •Теория фреймов. Достоинства и недостатки модели.
- •Логический вывод в ширину и глубину
- •Экспертная система – определение.
- •Классификация эс.
- •Правила
- •Пусть имеется вопрос
- •Специальные предикаты: fail,!.
- •Понятие списка. Обработка списков. Принадлежность элемента списку, выбор n-го элемента списка, соединение списков.
Специальные предикаты: 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, который всегда имеет значение ИСТИНА. Наряду с преимуществами при применении отсечения в Пролог- программе могут возникнуть сложности, связанные с процедурной семантикой языка. Дело в том, что в отдельных случаях применение отсечения связанно с определенным порядком предложений в тексте программы (например, в случае взаимоисключающих правил). Изме- нение порядка предложений может повлиять на результат работы программы.