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

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

Жанры

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

Используя предикаты readи phh,как они были определены выше, мы можем написать программу для печати краткого содержания исторических событий, хранящихся в базе данных, с помощью фактов с предикатом событие.Эта программа имеет вид:

обращение:-

phh(['Какая',дата,вас,'интересует?'!),read(D),coбытиe(D,S),pph(S).

Мы определили предикат обращение,не имеющий аргументов. Когда мы обращаемся к системе с вопросом

?-

обращение.

Пролог напечатает

Какая дата вас интересует?

и будет ждать ответа. Предположим, что мы ввели с клавиатуры

1523.

Обратите внимание на то, что после 1523 необходимо ввести точку, так как этого требует предикат read.И, как обычно, мы должны нажать клавишу

RETURN
, чтобы сообщить ЭВМ, что мы закончили ввод строки текста. После этого Пролог ответит

Кристиан II покинул Данию

Обратите внимание, что в первой строке тела правила обращениеиспользуется предикат phh,хотя в этом случае печатается не краткое содержание исторического события. Это просто показывает, что phhвполне подходит для печати произвольногосписка атомов независимо от того, откуда он взялся.

5.2. Ввод и вывод литер

Наименьшей единицей данных, которая может участвовать в операциях ввода-вывода, является литера. Мы уже знаем, что литеры интерпретируются как небольшие целые числа в соответствии с кодом ASCII. В Прологе имеется несколько встроенных предикатов для ввода и вывода литер.

5.2.1. Вывод литер

Если переменная Xимеет в качестве значения некоторую литеру (ее код ASCII), то эта литера будет напечатана при обработке целевого утверждения put(X).Предикат putвсегда выполняется и не может быть пересогласован (это приводит к неудаче). В качестве «побочного эффекта» putпечатает литеру на дисплее терминала. Например, мы можем напечатать слово helloдовольно необычным способом:

?- put(104),put(101),put(108),put(108),put(111).

hello

Результатом такой конъюнкции целей является печать Прологом литер h, е, l, l, онепосредственно под вопросом, как показано выше. Мы уже видели, что имеется возможность начать печать текста с начала следующей строки, использовав для этого предикат без аргументов nl. В действительности nl «печатает» некоторые управляющие литеры, что вызывает перевод курсора на дисплее терминала на начало следующей строки. Вопрос

?- put(104),put(105),nl,put(116),put(104),put(101),put(114), put(1O1).

вызвал бы следующую печать:

hi

there

Другой

предикат, с которым мы уже познакомились, - это tab(X),печатающий Xпробелов (ASCII код равен 32). Разумеется, переменной Xдолжно быть присвоено целое число. Отметим, что предикат tab(X)мог бы быть определен так:

tab(0):- !.

tab(N):- put(32), M is N-1, tab(M).

Теперь мы можем определить предикат, который мы назовем печать_строки. Если значением переменной Xявляется список кодов литер (строка), то целевое утверждение печать_строкинапечатает этот список (строку), используя putдля печати каждого элемента списка. Как и во всех подобных программах, граничным условием является появление пустого списка. Это условие мы и используем для завершения рекурсии. При непустом списке с помощью putпечатается голова списка, а затем используем печать_строки– хвост списка:

печать_строки([]).

печать_строки([Н|Т]):- put(H), печать_строки(Т).

?- печать_строки(«Чарлз V отрекся от престола в Брюсселе»).

Чарлз V отрекся от престола в Брюсселе

Если мы решили представлять краткое содержание исторических событий как строки литер, а не как списки атомов, то такого определения вполне достаточно, чтобы печатать строки из базы данных для предиката событие.

5.2.2. Ввод литер

Для ввода литер, набираемых на клавиатуре терминала, могут быть использованы предикаты get0(X)и get(X). Эти предикаты всегда согласуются с базой данных, если их аргументы неконкре-тизированы, а попытка повторного согласования всегда неудачна. При обработке целей, включающих эти предикаты, ЭВМ ожидает до тех пор, пока пользователь не наберет на клавиатуре какую-либо литеру. Указанные предикаты немного различаются тем, что get0(X)присвоит Xлюбую набранную на клавиатуре литеру независимо от ее вида. Напротив, get(X)пропустит все управляющиелитеры и присвоит Xв качестве значения первую печатаемую литеру. Как отмечалось в гл. 2, печатаемая литера – это литера, которая визуализируется на дисплее терминала.

Если Xуже присвоено значение, то целевое утверждение get(X)пропустит все управляющие литеры и сравнит следующую за ними печатаемую литеру со значением X. Доказательство согласованности целевого утверждения зависит от результата этого сравнения. Целевое утверждение get0(X)сравнивает Xсо следующей литерой и в зависимости от совпадения считается согласованным с базой данных или нет.

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

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

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

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

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

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

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

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

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