Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Предикат 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; Нарушение авторского права страницы