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

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

Жанры

Неизвестно

Шрифт:
empty-line />

С is N * N * N.

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

?- куб( 2, X).

Х = 8

?- ку6( 5, Y).

Y = 125

?- куб( 12, Z).

Z = 1728

Для

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

куб :-

read( X),

обработать( X).

обработать( стоп) :- !.

обработать( N) :-

С is N * N * N,

write( С),

куб.

Это был пример программы, декларативный смысл которой трудно сформулировать. В то же время ее процедурный смысл совершенно ясен: чтобы вычислить куб, сначала нужно считать X, а затем его обработать; если Х = стоп, то все сделано, иначе вывести Х3 и рекурсивно запустить процедуру куб для обработки остальных чисел.

С помощью этой новой процедуры таблица кубов чисел может быть получена таким образом:

?- куб.

2.

8

5.

125

12.

1728

стоп.

yes

Числа 2, 5 и 12 были введены пользователем с терминала, остальные числа были выведены программой. Заметьте, что после каждого числа, введенного пользователем, должна стоять точка, которая сигнализирует о конце терма.

Может показаться, что приведённую процедуру куб можно упростить. Однако следующая попытка такого упрощения является ошибочной:

куб :-

read( стоп), !.

куб :-

read( N),

С is N * N * N,

write( С),

куб.

Причина, по которой эта процедура работает неправильно, станет очевидной, если проследить, какие действия она выполняет с входным аргументом, скажем с числом 5. Цель read( стоп) потерпит неудачу при чтении этого числа, и оно будет потеряно навсегда. Следующая цель read введет следующий терм. С другой стороны может случиться, что сигнал стоп будет считан целью read( N), что приведет к попытке перемножить нечисловую информацию.

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

куб :-

write( 'Следующее число, пожалуйста:'),

read( X),

обработать( X).

о6работать( стоп) :- !.

обработать( N) :-

С is N * N * N,

write( 'Куб'), write( N), write( 'равен').

write( С), nl,

куб.

Разговор с новой версией мог бы быть, например, таким:

?- куб.

Следующее число, пожалуйста: 5.

Куб 5 равен 125

Следующее число, пожалуйста: 12.

Куб 12 равен 1728

Следующее число, пожалуйста: стоп.

yes

В некоторых реализациях для того, чтобы приглашение появилось на экране перед чтением, необходимо выдать дополнительный запрос (такой, скажем, как ttyflush) после записи.

В последующих разделах мы увидим некоторые типичные примеры операций, в которых участвуют чтение и запись.

6. 2. 2. Вывод списков

Кроме стандартного прологовского формата для списков существуют несколько других естественных форм их внешнего представления, которые в некоторых ситуациях являются более предпочтительными. Следующая процедура

вывспис( L)

выводит список L так, что каждый его элемент занимает отдельную строку:

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

Я, последний. Трилогия

Нимфар / Nimfar
Фантастика:
фэнтези
попаданцы
7.30
рейтинг книги
Я, последний. Трилогия

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Вероника

Знаменская Алина
Проза:
современная проза
8.77
рейтинг книги
Вероника

Колдун из Салема

Хольбайн Вольфганг
1. Салемский колдун
Фантастика:
фэнтези
ужасы и мистика
8.00
рейтинг книги
Колдун из Салема

Том 6. Дураки на периферии

Платонов Андрей Платонович
6. Собрание сочинений
Поэзия:
драматургия
5.00
рейтинг книги
Том 6. Дураки на периферии

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

"Фантастика 2023-180". Компиляция. Книги 1-23

Лисина Александра
Фантастика 2023. Компиляция
Фантастика:
научная фантастика
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-180. Компиляция. Книги 1-23

Кровь, слезы и лавры

Пикуль Валентин Саввич
Исторические миниатюры
Проза:
историческая проза
5.00
рейтинг книги
Кровь, слезы и лавры

"Современная зарубежная фантастика-2". Компиляция. Книги 1-24

Уэллс Марта
Современная зарубежная фантастика
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
постапокалипсис
5.00
рейтинг книги
Современная зарубежная фантастика-2. Компиляция. Книги 1-24

Далёкий край (др. изд.)

Задорнов Николай Павлович
1. Освоение Дальнего Востока
Проза:
историческая проза
7.00
рейтинг книги
Далёкий край (др. изд.)

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
7.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Собрание сочинений Джерома Клапки Джерома в одной книге

Джером Клапка Джером
7. Абсолют
Проза:
классическая проза
5.00
рейтинг книги
Собрание сочинений Джерома Клапки Джерома в одной книге

Второгодка. Книга 4. Подавать холодным

Ромов Дмитрий
4. Второгодка
Фантастика:
героическая фантастика
альтернативная история
сказочная фантастика
6.25
рейтинг книги
Второгодка. Книга 4. Подавать холодным