Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Предикат fail (безуспешное выполнение)



Предикат fail всегда приводит к безуспешному выполнению правило, в котором он использован, что приводит к поиску альтернативных решений.

При использовании внутренней цели поиск прекращается после первого успешного сопоставления цели. Для получения всех возможных решений используется предикат fail.

Пример:

cars('BMW').

cars('Toyota').

cars('Ford').

cars('Nissan').

go:-cars(X),write(X),nl,fail.

:-initialization(go).

/*предикат в скобках будет выполняться

автоматически при запуске программы */

Предикат true (истина)

Предикат true всегда выполняется успешно.

Пример:

a:-true. % это аналогично строчке a.

Списки

Список – это набор термов, следующих друг за другом. Пустой список [ ]. Пример непустого списка: [a,b,c,d]. Список состоит из головы и хвоста, где голова – это первый элемент списка, хвост – это список без первого элемента. Операция деления списка на голову и хвост обозначается при помощи вертикальной черты.

Пример:

?-[1,2,a,b]=[H|T].

H=1

T=[2,a,b]

?[]=[H|T].

No

В среде Turbo Prolog, имеющий явную типизацию, для использования списков необходимо явно объявлять в разделе domains соответствующий домен через домен элемента списка и символ *:

Пример:

domains

strlist=string*

В конкретных реализациях языка (конкретных средах разработки) может присутствовать ряд встроенных предикатов для работы со списками. Например, member( Elem, List), который успешен, если элемент Elem входит в список List, append( List1, List2, List3) – успешен, если список List3 является объединением первых двух списков и delete( L1, Elem, L2) – удаляет элемент Elem из списка L1 и сопоставляет полученный список с L2.

Примеры использования:

?-member(3,[1,2,3]).

Yes.

?-member(X,[1,2,3]),X<2.

X=1

?-append([1,2],[2,3],L).

L=[1,2,2,3]

?-append(X,Y,[1,2,3]).

X=[]

Y=[1,2,3]

X=[1]

Y=[2,3]

X=[1,2]

Y=[3]

X=[]

Y=[1,2,3]

?-delete([1,2,3],2,L).

L=[1,3]

При отсутствии встроенных предикатов для работы со списками, они могут быть легко реализованы самостоятельно, например, как показано ниже:

member(Name, [Name|_]).

member(Name, [_|Tail]):-

member(Name, Tail).

При необходимости, легко могут быть реализованы и другие операции обработки списков:

length([], 0). /* предикат

для нахождения количества

элементов в списке */

length([X|L], N):-

length(L, M), N is M+1.

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

write_list([])./* предикат

для вывода элементов списка

на экран */

write_list([H|T]):-

write(H),nl,write_list(T).

read_list([X|T]):-

write('Введите элемент: '),

read(X), X\=end,!,

read_list(T). %ввод списка

 

Откат (backtrace)

Откат – это поиск с возвратом, в результате которого находятся все варианты решения.

Пример:

большой(медведь).

большой(слон).

маленький(кот).

бурый(медведь).

черный(кот).

серый(слон).

темный(Z):-черный(Z).

темный(Z):-бурый(Z).

?-темный(X),большой(X).

При непосредственном обращении к Пролог-системе (в командной строке интерпретатора) производится поиск всех возможных решеений с использованием механизма отката до точки (предиката), для которого ещё остались ранее не рассмотренные решения.

 

1.6. Предикат ! (отсечение)

Отсечение – встроенный предикат, который заставляет Пролог-систему забыть все указатели отката, установленные во время попыток вычислить текущую подцель (отмена поиска альтернатив для текущей подцели). Всегда выполняется успешно. Введение «!» повышает эффективность программы, сокращая время перебора и объем памяти.

Примеры:

Программа без отсечения:

data(one).

data(two).

data(three).

test(X,Y):-data(X),data(Y).

test('four','five').

?-test(X,Y).

X=one

Y=one

X=one

Y=two

X=one

Y=three

X=two

Y=one

X=two

Y=two

X=two

Y=three

X=three

Y=one

X=three

Y=two

X=three

Y=three

X=four

Y=five

Эта же программа, но с отсечением:

data(one). 

data(two).

data(three).

test(X,Y):-data(X),!,data(Y).

test('four','five').

?-test(X,Y).

X=one

Y=one

X=one

Y=two

X=one

Y=three

Другие примеры использования предиката отсечения:

f(X, 0):-X<3, !

f(X, 2):- 3=<X, X<6, !.

f(X, 4):-6 =<X, !.

minimum(X, Y, X):- X<=Y, !.

minimum(X, Y, Y):- Y<X.

add(X, L, L):-member(X, L), !.

add(X, L, [X|L]).

factorial(0, 1):-!. /* предикат

для вычисления факториала

factorial(N, RES) :- N1 is N-1,

factorial(N1, N1fak),

Res is N*N1fak.

 


Поделиться:



Последнее изменение этой страницы: 2019-06-20; Просмотров: 244; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.014 с.)
Главная | Случайная страница | Обратная связь