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

Отсечение

В процессе достижения цели Пролог-система осуществляет автоматический перебор вариантов, делая возврат при неуспехе какого-либо из них. Такой перебор – полезный программе механизм, так как он освобождает пользователя от необходимости производить этот перебор самому. С другой стороны ничем не ограниченный перебор может быть источником неэффективности программы. Поэтому требуется его ограничить или исключить вовсе. Для этого предусмотрено специальное целевое утверждение «!,», называемое отсечением. Отсечение реализуетяс следующим образом: после согласования ЦУ, стоящего перед отсечением, все предположения с тем же предикатомрасположенные после отсечения не рассматриваются. предположим, что надо вычислить число родителей кого-нибудь.

число_родителей (адам, 0):-,!

число_родителей (ева, 0):-,!

число_родителей (_, 2).

Можно выделить три основных функци отсечения:

  1. Для устранения бесполезного цикла ( вычисление суммы 1+2+…+N)

сумма (1, 1):-,!

сумма (N, K):- N1=N-1, сумма (N1, K1), K=K1+N.

Если граничное условие будет записано в виде сумма (1, 1). , то сопоставление головы правила с запросом будет происходить успешно и при n=0, то есть будет предпринята попытка доказать цель сумма (0, К), что в свою очередь приводит к цели сумма (-1, К) и т.д.

  1. При программировании взаимоисключающих утверждений.

max (X, Y, Max)

max (X, Y, X):- X>=Y.

max (X, Y, Y).

Или

max (X, Y, X):- X>=Y,!

max (_, Y, Y).

  1. При необходимости неудачного завершения цели.

категория (Кр, _):- Кр>100,!, fail; Кр<0, !, fail.

категория (Кр, ‘A’):- Кр>80, !

категория (Кр, ‘В’):- Кр>40, !

категория (Кр, ‘С’).

Отрицание (not)

Встроенный предикат not имеет один аргумен. Этим аргументом являетяс отношение, значение истинности которого (после обработки этого отношения) заменяется на противоположное.

Использование составных объектов

Объекты утверждений представляют собой данные. Тип простых данных ограничен 6-ю стандартными типами.

любит (петр, музыка)

Оба объекта петр, музыка имеют простую структуру, они представляют самих себя. Любой объект представляющий сам себя называетяс простым объектом. Структура, состоящая из простых объектов, называетяс простой. Объект, представляющий другой объект или совокупность объектов, называется составным объектом, а использующая такие объекты структура, называетяс составной структурой.

Пример:

любит (том, яблоки, апельсины, бананы).

Все 3 вида фруктов можно объединить в одной структуре:

фрукты (яблоки, апельсины, бананы).

В результате появится составной объект, который поясняет отношение:

любит (том, фрукты (яблоки, апельсины, бананы)).

Функтор составного объекта фрукты является предметом, хотя он и выставлен внутри другого предиката. Главным функтором здесь является предикат любит.

domains

любимые_фрукты = фрукты (тип1, тип2, тип3)

имя, тип1, тип2, тип3 = symbol

predicates

любит (имя, любимые_фрукты)

Это одноуровневый составной объект.

Списки. Описание. Голова и хвост списка.

Список – специальный вид сложного терма, состоящий из последовательности термов, заключенных в [ ] и разделенных запятыми.

domains

list = integer* % целочисленный список

Если элементы списка имеют смешанный тип, то должно быть соответствующее описание:

domains

element = c (char); i (integer)

list = element*

[c(‘a’), i(6), i(-8), c(‘X’)]

Списки являются основной структурой программы на ТП. Для удобства обработки введены два понятия: голова (head), хвост (tail).

Основные примеры обработки списков:

Список

Голова

Хвост

[‘a’, ‘b’, ‘c’]

‘a’

[‘b’, ‘c’]

[1]

1

[ ]

[ ]

не определена

не определена

[[1, 2, 3], [2, 3, 4], [ ]]

[1, 2, 3]

[[2, 3, 4], [ ]]

Для отделения головы спсика от хвоста используется символ “|” [X|Y].

Сцепление двух спиcков.

concat ([ ], L, L).

concat ([H|T], L2, [H|T3]):- concat (T, L2, T3).

Добавление элемента Х к началу списка L

add (X, L, [X|L]

в конец

add_end (X, L, L1)

add_end (X, [ ], [X]).

add_end (X, [H|T], [H|T1]):- add_end (X, T, T1).

обращение списка

domains

l =real*

predicates

revers (l, l)

reversl (l, l, l)

clauses

revers (L, Lr):- reversl (L, [ ], Lr).

reversl ([ ], Lr, Lr).

reversl ([H|T], L, Lr):- reversl (T, [H|L], Lr).

Правило ввода списка(3 варианта), вывод списка.