Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пролог.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
33.88 Кб
Скачать

Механизм возврата.

В классическом процедурном программировании реализуется детерминированный поиск решения . алгоритм включает проверку условий который всегдв обеспечивает выбор правильного пути решения задачи. В ии кол-во возм проверок и вариантов продолжения настолько велико , что описать его физически невозможно. Поэтому основным методом решения задач является недетерминированный поиск. Фактически это озн, что нам необх выполнить полный перебор всех путей, которые могут привести к решению . Если цель унифицируется с заголовком некоторого правила то это озн, что правило можно применить, но не озн что мы двигаемся в правильно направлении. Может так случится что на оном из следующих шагов для очередной цели нельзя найти сопоставимое правило; это озн что мы зашли в тупик и нам нужно вернуться назад до той точки, где можно выбрать другое сопоставимое правило. На каждом шаге возможны следующие ситуации. Возможны следующие ситуации:

  • Решение найдено

  • решение еще не найдено, но есть варианты продолжения( вперед или назад)

  • решение не найдено и дальнейший переход не возможен(вопрос не выводим из проги)

Особенности вычислительной модели пролога.

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

Чтобы создать эффективную систему логического вывода необходимо уточнить процедурные детали. В прологе упорядочены обе процедуры

  1. Для выбра цели которую нужно снять используется стековый метод. Стек целей предп растущим влево, а для снятия всегда выбирается самая левая цель

  2. Правила просматриваются в порядке их записи. Часто это используется механизмом возврата.

Декларативная и процедурная семантика программ.

Порядок простомтра базы данных

Рассмотрим отношение однокурсники.

Студент(X,K). // имя, курс

Однокурсник(X,Y):- студет(X,k1), студент(Y,k2),X\=Y,K1=K2

Студент(Иванов,1)

Сидоров(петров,4)

Студент(Петров,2)

Студент(кузнецов,4)

****

Управление вычислениями, предикат fail.

Управление эффективным выполнение задач – традиционная задача программиста, но в логическом программировании проц вывода встроена в интерпр систему и поэтому менять алгоритм вывода мы не можем. Однако в нек случаях мы знаем что некоторые пути решения будут бесплодны и поэтому желательно иметь возможность указать программе, что они в выводе участвовать не должны. Напр если не выполнено нек условие, то применять процедуру не имеет смысла, или нам достаточно одного решения и нужно запретить искать альтернативные.

Max(x,y.x):- x>y.

Max(x,y,y):- x<y.

?-max(5,2,5).

Если первое правило выполнено успешно то выполнение второго не нужно. Для этого используется предикат cut. Он включается в конъюнкцию целей. Свойства отсечения:

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

Max(x,y,z):- x>=y,!, z=x

Max(x,y,y).

?-max(3,2,2).

У отсечения имеются противники, основной их аргумент – применение отсечения меняет декларативный смысл программы.

Для управления выводом можно также применять предикат fail, который никогда е согласуется. Этот предикат часто применяется вместе с отсечением.

Отрицание в логических программах

Логическое программирование строиться на основе специальной формы логики предикатов, которая называется клауза-хорна. В этом варианте формулы логики предикатов не могут включать отрицание, поэтому в логическом программировании в процедурах представлена только позитивная информация. Так как в программах иногда необходимо отражать и негативную информацию, то в логике предикатов моделируется ограниченная форма отрицания. Множество утверждений из которых состоит логическая программа называют миром. Логическое программирование строится на предположении замкнутости мира, те знаниями является только то, что содержится в логической программе. Если нек. утверждения не представлены в логич прогрмме, то считается что представлено его отрицание, поэтому не делается различия между ложностью и отсутствие утверждения. Для того чтобы представить отрицание в логич. программировании реализуется предикат not(), который имеет следующий смысл – если x не выводимо из программы, то цель not(x) согласуется и наоборот.

Not(x):- x,!,fail.

Not(x).

Для ответ на вопрос примем первое правило. Допустим x выводимо из программы, тогда получает cut &fail . Если X не выводится из программы, то первое правило приментять нельзя, а второе факт которой всегда успешно согласуется.

Представление списков в логических программах

Списки в языках ии являются основной структурой данных, однако они рассм иначе чем в традиционном программировании. Обычный односвязный список состоит из элементов, каждый из которых содержит значение и ссылку на следующий элемент. Последий элемент ссылается на заглушку. В ИИ списки определяются рекурсивно. Список разбивается на голову и хвост. Голова – это элемент, а хвост это список. В роли элемента-заглушки выступает пустой список. Список- структура, состоящая из головы и хвоста, причем хвост является списком.Исторически первая форма предствления списков использовала функтор, предоставляемый точкой.

.(a,.(b,.(c,[]))) – список abc

Элементами списка мб любые данные, в тч и списки. В прологе используется более простая форма записи. – [a,b,c,d], а пустой список-заглушка не указывается. Однако пустой список может являться элементом другого списка. Для тог чтобы отделить голову от хвоста используется | .

[a|[b,c,d]]

Унификация списков.

Списки являются разновидностью составных термов, и унифицируются по общим правилам. Для этого список достаточно представить в точечной нотации. Если использовать нотацию пролога, то для унификации могут потребоваться некоторые преобразования. Во первых успешно унифицироваться могут только списки равной длинны, поэтому для унификации может потребоваться изменить разбиение списка на голову и хвост. Переменная, стоящая слева от вертикальной черты унифицируется успешно с простым значение; переменная, стоящая справа от верт черты должна унифицироваться со списком.

  1. [L]=[] - унификация невозможна L должна унифицироваться с элементом, а в пустом списке элементов нет.

  2. [L]=[a|[]] унификации успешна L=a

  3. [L,b]=[a,b] L=a, b=b

  4. [[L],b]=[a,b] – унификация невозможна, список с атомом не унифицируется

  5. [a|L]=[a,b,c] a=a L=[b,c]

  6. [a,L]=[a,b|[c]] a=a L=[b|[c]]