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

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

Жанры

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

Прежде чем перейти к рассмотрению управляемой трассировки, следует сделать несколько замечаний о том, как Пролог выдает сведения о целях во время трассировки. На самом деле, способ выдачи сведений о целях средствами трассировки не обязательно совпадает с тем, который используется предикатом 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). Когда процесс согласования исходного вопроса заходит уже достаточно далеко, возникает цель вида:

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

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Я еще граф. Книга #8

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Я еще граф. Книга #8

Менталист. Трансформация

Еслер Андрей
4. Выиграть у времени
Фантастика:
фэнтези
альтернативная история
7.28
рейтинг книги
Менталист. Трансформация

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

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

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

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

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

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

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II

Буря соперничества

Мазуров Дмитрий
4. Громовая поступь
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Буря соперничества

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

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

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

На границе империй. Том 10. Часть 9

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 9