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

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

Жанры

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

Прежде чем перейти к рассмотрению управляемой трассировки, следует сделать несколько замечаний о том, как Пролог выдает сведения о целях во время трассировки. На самом деле, способ выдачи сведений о целях средствами трассировки не обязательно совпадает с тем, который используется предикатом write.Это происходит потому, что для выдачи сведений о целях пользователю разрешается задавать свои собственные определения. Вы можете воспользоваться этой возможностью для того, чтобы вывести какие-либо общие структуры, используемые в вашей программе, особым способом, который обеспечивает большую наглядность и выразительность, чем обычный вывод с помощью предиката write.Эта возможность осуществляется следующим образом. Стандартный способ выдачи сведений о целях опирается на использование встроенного предиката printс единственным аргументом. Предикат printдействует, как если бы он был определён следующим образом:

print(X):- portray(X),!.

print(X):- write(X).

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

portray(присоединить(А,В,С)):- writе('присоединить('), write(A), write(','), write(B), write(','), write('‹foo›)').

Каждый раз когда встретится цель X, содержащая предикат присоединить,приведенное утверждение будет обеспечивать успешное согласование цели portray(X),и вывод трассировочной информации будет полностью возложен на данное утверждение. В случае цели, содержащей любой другой предикат, цель port-гау(Х)не согласуется с базой данных и потому сведения об X будут выданы с помощью предиката write(X).Если бы приведенное выше утверждение присутствовало в базе данных, то соответствующая часть приведенного выше протокола трассировки выглядела бы следующим образом:

?- присоединить ([a],[b],X).

CALL присоединить([а],[b],‹fоо›)

CALL присоединить ([],[b],‹foo›)

EXIT присоединить([],[b],‹fоо›)

EXIT присоединить([a],[b],‹foo›)

X = [a,b];

REDO присоединить([a],[b],‹foo›)

REDO присоединить([],[b],‹foо›)

FAIL присоединить([],[b],‹foo›)

FAIL присоединить ([a],[b],‹foo›) нет

Т

еперь рассмотрим управляемую трассировку. Если вы задали управляемую трассировку для событий некоторого типа, то Пролог спросит у вас, что нужно сделать после того, как наступит событие заданного типа. На терминале это может выглядеть примерно так:

?- присоединить ([а],[b],Х).

CALL присоединить([а],[b],_43)?

После вывода литеры '?' программа останавливается. Теперь от вас требуется ответ – команда, которой вы зададите одно из возможных действий. Если затребованное вами действие означает продолжение обычного выполнения программы, то она продолжит выполнение до тех пор, пока трассировка не дойдет до следующего управляемого события для прослеживаемого предиката. И опять вам будет задан вопрос вида:

CALL присоединить([],[b],_103)?

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

Выдача информации о цели

Первая группа команд предназначена для выдачи информации о цели в различных форматах. Как мы уже знаем, стандартным средством выдачи сведений о цели является предикат print,в рамках которого с помощью определяемого пользователем предиката portrayможно выводить нужные сведения в нужном формате. Однако у пользователя могут возникнуть сомнения в правильности утверждений, определяющих portray,или он может пожелать увидеть цель в обычной форме. Поэтому Пролог предоставляет команду, дающую вам возможность вывести сведения о текущей цело с помощью предиката writeили display. Вэтом случае программа не продолжает выполняться, а пользователя просят задать еще одну команду, которая укажет как следует продолжать выполнение программы. Как правило, этот диалог имеет следующий вид:

?- присоединить([a],[b],X).

CALL присоединить([а],[b],‹fоо›)? write

CALL присоединить([а],[b],_103)?

Обычно в качестве альтернативного способа вывода сведений о цели используют write.Предикат displayможет понадобиться в том случае, когда цель содержит много операторов, и вы забыли приоритеты их выполнения. В этом случае displayпоможет вам однозначно определить вложенность функторов.

Выдача информации о предшественниках

Предшественниками данной цели называются те цели, согласованность которых зависит от согласованности данной цели. На наших диаграммах с прямоугольниками это те цели, прямоугольники которых включают данную цель. Так, каждая цель имеет предшественника, который в свою очередь является одной из целей исходного вопроса – той целью, согласованию которой помогает текущая цель. Аналогично, когда речь идет о правиле, каждая цель, порожденная телом правила, имеет в качестве предшественника ту цель, которая сопоставлена с заголовком правила. Рассмотрим некоторые примеры предшественников. Обратимся к следующей простой программе обращения списка (которая рассматривалась в разд. 7.5):

обр([],[]).

oбp([H|T],L):- oбp(T,Z), присоединить(Z,[H],L).

присоединить([],X,Х).

присоединить([А|В],С,[А|D]):- присоединить(В,С,D).

Пусть мы задали исходный вопрос:

?- oбp([a,b,c,d],X). (A)

Тогда, вследствие второго утверждения, возникают две подцели, каждая из которых в качестве своего непосредственного предшественника имеет цель, составляющую содержание исходного вопроса. Вот эти подцели:

oбp([b,c,d],Z) (B)

присоединить(Z,[a],X) (C)

Поскольку второе утверждение будет снова использовано при согласовании (B),снова возникают две подцели:

oбp([c,d],Z1) (D)

присоединить(Z1,[a],Z) (E)

Их предшественниками являются цели (A)и (B).Заметим, что цель (C)не является их предшественником, поскольку от них непосредственно зависит только согласованность (B), от которой, в свою очередь, зависит согласованность (А).Цели (D)и (E)никак не влияют на согласованность (C). Когда процесс согласования исходного вопроса заходит уже достаточно далеко, возникает цель вида:

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

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3

П 2

Дронт Николай
2. Придворный
Фантастика:
фэнтези
героическая фантастика
5.00
рейтинг книги
П 2

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник

Гримуар темного лорда VI

Грехов Тимофей
6. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VI

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Законы Рода. Том 4

Мельник Андрей
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Портрет дьявола: Собрание мистических рассказов

Скотт Вальтер
Проза:
классическая проза
8.09
рейтинг книги
Портрет дьявола: Собрание мистических рассказов

Пересмешник

Пехов Алексей Юрьевич
Фантастика:
фэнтези
9.38
рейтинг книги
Пересмешник

Князь Целитель 5

Ткачев Андрей Юрьевич
5. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 5

Барон. Книга вторая

Первухин Андрей Евгеньевич
6. Ученик
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Барон. Книга вторая

Гром Раскатного. Том 1

Володин Григорий Григорьевич
1. Штормовой Предел
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гром Раскатного. Том 1

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

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

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

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон