Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

5.7 Вычисление n!

n! = (n-1)! * n; 0!=1

факториал(0,1):-!.

% Этот факт определяет, что факториал 0 равен 1 и что после

% того, как будет найден 0! прекратить вычисления ( предикат

% отсечения запретит выбор любой альтернативы).

факториал(N,X):- M is N-1, факториал(M,Y),

X is Y*N.

?- факториал(0,1)

yes M:=-1,факториал(-1,Y), ...

¦

факториал(-2,Y), ...

¦

...

Чтобы м.б. отвечать на запросы : факториал(0,2) необходимо преобразовать исходный вариант следующим образом :

факториал(0,X):- 1 is X, !.

факториал(N,X):- M is N-1, факториал(M,Y),

X is Y*N.

5.8 Область действия предиката отсечения

абс_знач_элем(X,L) - true, если L содержит в себе такой элемент, абсолютное значение которого = X. L - список.

Воспользуемся уже определенным ранее предикатом abs.

абс_знач_элем(X,L) :-

элемент(E,L),abs(E,X).

абс_знач_элем(X,L) :-

элемент(E,L), Раскрыли abs

( E >=0, !, X is E;

X is -E ).

?- абс_знач_элем(2, [1,-2])

элемент( E,[1,-2]),(E >=0, !, 2 is E;

2 is -E).

E=1 E= -2

1>=0 Область действия предиката ! - весь

/ предикат, в котором он определен -

т.е. он уничтожает все альтернативы

!,2 is 1 данного предиката

fail 2 is -1

Предикат отсечения ! не запрещает точки выбора находящиеся под ним.

Существуют и другие предикаты отсечения - "/" - например, стирает только ветвь в пределах группы. Если же этот предикат используется вне пределов группы, то его действие эквивалентно действию предиката !.

ПРЕДИКАТЫ fail и succeed

Эти предикаты указывают на неудачу (fail) или успех (succeed). fail применяют в тех случаях, когда в задаче нужно выделить несколько исключений. Например:

и_после_ц_в_слове(цыган):-!, fail.

и_после_ц_в_слове(цыц):- !,fail.

и_после_ц_в_слове(цыпленок):- !,fail.

и_после_ц_в_слове(цыпочки):- !,fail.

и_после_ц_в_слове(X).

Использование fail без ! бессмысленно, т.к. предикат может выполниться для любого объекта.

succeed :- !. - Отдельно определяется для того, чтобы ограничить область действия "!" предикатом succeed.

и_после_ц_в_слове(X):-

слово_принадлежит_исключениям(X), !, fail;

succeed.

5.9 Отрицание на пролоГе

Определим предикат : " не является элементом X,L"

не_явл_элем(X,L) :-

элем(X,L), !, fail;

succeed.

Такое определение не совпадает с понятием логического отрицания, т.к. исходит из предположения "замкнутости мира", т.е. что не истинно, то ложно. Однако это не всегда выполняется на практике.

отец(X,Y)

?- отец(X,Петр)

не_отец(X,Y):-

отец(X,Y), !, fail;

succeed.

?- элемент(X,[1,2,3]). ?- не_отец(X,Петр).

X=1; no. //ответ нет м.б. и в том

X=2; //случае, если Петр дей-

X=3. //ствительно не является

?- не_элемент(X,[1,2,3]). //отцом X, и в том случае

X=4; //если в БД нет такого

X=5; //факта.

...

Этим свойством можно воспользоваться, например, для установления сопоставимости двух выражений таким образом, чтобы сопоставление производилось без конкретизации переменных.

может_быть_сопоставлен(X,Y):- // Истина, если X и Y -

отличаются(X,Y), !, fail; // одинаковые об'екты

succeed.

отличаются(X,Y):- // " = " -знак сопоставления. Слева

X = Y, !, fail; // и справа м.б. любой объект ПРОЛОГ

succeed. // вплоть до предикатов.

?- может_быть_сопоставлен(a(1,J),a(Z,2))

отличаются(a(1,J),a(Z,2)), !, fail;

a(1,J) = a(Z,2), !,fail, succeed

!,fail

Z=1

J=2

!,fail,!,fail

,!,fail Надо искать новую т. выбора

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