Чтение онлайн

на главную - закладки

Жанры

Программирование на языке пролог
Шрифт:

Мы можем определить с помощью предиката clauseнекоторую версию процедуры listing.Определим предикат распеч1такой, что при согласовании цели распеч1(Х)с базой данных из последней будут выводиться на печать утверждения, заголовки которых совпадают с X. Поскольку определение распеч1включает использование предиката clause, у которого Xзадан как первый аргумент, то мы вынуждены поставить условие, что переменная Xконкретизирована таким образом, что главный функтор утверждения известен. Рассмотрим определение распеч1:

распеч1(Х):-clause(Х,Y),выв_утвержд(Х,Y),write('.'),nl,fail.

распеч1(Х).

выв_утвержд(Х,true):-!, write(X).

выв_утвержд(Х,Y):- write((X:- Y)).

При

попытке согласовать с базой данных цель распеч1(Х)первое утверждение осуществляет поиск в базе данных такого утверждения, у которого заголовок совпадает с X. Если такое утверждение найдено, то оно выводится на печать и затем с помощью предиката failинициируется механизм возврата. Возвратный ход опять приводит нас к предикату clause,который находит другое такое же утверждение, если оно имеется, и т. д. Когда таких утверждений больше нет, цель clauseбольше не удается согласовать с базой данных. В этом случае будет выбрано второе утверждение определения предиката распеч1,и потому цель будет согласована с базой данных. «Побочным эффектом» этих действий является печать соответствующих утверждений. Определение предиката выв_утверждзадает способ печати найденных утверждений. Выделяется специальный случай, когда тело утверждения есть true.В этом случае на печать выводится только заголовок утверждения. Иначе на печать выводится заголовок и тело утверждения, соединенные функтором ':-'. Отметим, что использование «отсечения» здесь имеет целью указать, что в случае, когда тело есть true,можно применять только первое правило. Поскольку данный пример построен на использовании механизма возврата, то задание отсечения здесь существенно.

Встроенный предикат clauseможно также применить при написании Пролог-интерпретатора на самом Прологе. Это означает, что мы можем определить действия, которые представляют собой выполнение Пролог-программы, причем исполнителем этих действий также является Пролог-программа. Ниже приводится определение предиката интерпреттакого, что цель интерпрет(Х)согласуется в том и только в том случае, когда X, рассматриваемая как цель, согласуется с базой данных.

Предикат интерпретнапоминает встроенный предикат call,но является более ограниченным.

интерпрет(true):-!.

интерпрет((Gl,G2)):-!, интерпрет(G1), интерпрет(G2).

интерпрет(Цель):-clause(Цель,ЕщеЦели), интерпрет(ЕщеЦели).

Первые два утверждения рассчитаны на специальные случаи, когда цель есть trueи когда цель представляет собой конъюнкцию целей. Последнее утверждение рассчитано на случай простой цели. Данная процедура находит утверждение, заголовок которого совпадает с заданной целью, и затем интерпретирует цели, входящие в тело этого утверждения. Заметим, что приведенное определение не рассчитано на программы, где используются встроенные предикаты, поскольку у таких предикатов нет определяющих их в обычном смысле утверждений.

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

consult(Файл):-seeing(Input),sее(Файл),repeat,read(Tepм),обработать(Терм),seen,see(Input),!.

обработать(Терм):- маркер_конца_файла(Терм),!.

обработать((?- Q)):-!, call(Q),!, fail.

обработать(Утвержд):- assertz(Утвержд), fail.

Это определение отличается рядом интересных особенностей. Во-первых, цель seeing(Input)и ее партнер see(Input)призваны гарантировать, что текущий файл ввода не будет «забыт» после применения

предикат consult.Во-вторых, предикат маркер_конца_файлаздесь использован без определения. По замыслу он должен быть истинным только в том случае, когда его аргумент конкретизирован термом, используемым для представления конца файла (который мог бы встретиться при выполнении read). Вразных реализациях Пролога для представления «конца файла» используются разные термы, поэтому маркер_конца_файлав разных реализациях может быть определен по-разному. Одно из возможных определений выглядит так:

маркер_конца_файла(конец_файла).

В определении предиката обработатьинтересна организация выполнения соответствующих действий для каждого терма, считанного из входного файла. Целевое утверждение обработатьдоказуемо только, когда его аргументом является маркер конца файла. Иначе после соответствующего действия имитируется неудача доказательства и инициируется механизм возврата, который возвращает программу к предикату repeat.Отметим важность «отсечения» в конце определения предиката consult.Оно фиксирует выбор, сделанный предикатом repeat [13] .И последнее замечание. Если терм, считанный из файла, представляет собой вопрос (см. второе утверждение определения предиката обработать),то делается попытка немедленно согласовать соответствующую цель с помощью предиката call(см. разд. 6.7).

13

Тем самым обеспечивает возможность вновь согласовать предикат consult. В противном случае механизм возврата никогда не смог бы миновать repeat, у которого всегда есть альтернативное решение.
– Прим. ред.

В качестве примера использования предиката retractздесь приведено определение полезного предиката уберивсе.При согласовании с базой данных целевого утверждения уберивсе(Х)все утверждения, заголовки которых совпадают с X, удаляются из базы данных. Поскольку в данном определении используется предикат retract,то переменная Xне может быть неконкретизированной, так как в противном случае не с чем будет сопоставлять утверждения из базы данных. Данное определение должно распознавать два вида утверждений с заголовками, совпадающими с X, - факты и правила. При обработке этих двух видов утверждений в вызове retractзадаются разные аргументы. В определении используется то свойство, что retractбудет срабатывать при возврате до тех пор, пока все утверждения, сопоставимые с его аргументами, не будут удалены из базы данных.

уберивсе(Х):- retract(X), fail.

уберивсе(Х):- retract((X:- Y)), fail. уберивсе(_).

В качестве примера использования предиката уберивсе здесь приведено определение предиката reconsultна Прологе. Назначение предиката reconsultсходно с назначением предиката consult,с той лишь разницей, что при reconsultкаждое считанное утверждение замещает существующее утверждение того же предиката, а не добавляется к нему (см. разд. 6.1).

reconsult(Файл):-уберивсе(сделано(_)),seeing(Старый),sее(Файл),repeat,read(Терм),проверить(Терм),seen,see(Старый),!.

проверить(Х):- маркер_конца_файла(Х),!.

проверить((?- Цели)):-!, call (Цели),!, fail.

проверить(Утверждение):-заголовок(Утверждение, Заголовок), запись_сделана(3аголовок), assertz(Утверждение), fail.

запись_сделана(3аголовок):- сделано(Заголовок),!.

запись_сделана(3аголовок):- functor(Заголовок,Func,Arity), functor(Proc,Func,Arity), asserta(cдeлaнo(Proc)), уберивсе(Ргос),!.

Поделиться:
Популярные книги

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо

Мимик нового Мира 14

Северный Лис
13. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 14

Правила Барби

Аллен Селина
4. Элита Нью-Йорка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Правила Барби

Морозная гряда. Первый пояс

Игнатов Михаил Павлович
3. Путь
Фантастика:
фэнтези
7.91
рейтинг книги
Морозная гряда. Первый пояс

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Маленькая слабость Дракона Андреевича

Рам Янка
1. Танцы на углях
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Маленькая слабость Дракона Андреевича

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Последняя Арена

Греков Сергей
1. Последняя Арена
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.20
рейтинг книги
Последняя Арена