Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

5.13.2 Предикаты ввода-вывода термов

Для чтения и записи термов используют предикаты read и write.

read(X)  - читает терм из входного потока и сопоставляет его с X. В случае неуспеха не происходит возврата для ввода следующего терма и read терпит неудачу.

Терм, который считывается из входного потока должен заканчиваться '.' и, в зависимости от версии или ' '(пробел) или символом 'ВК'. Наиболее часто встречается '.' При считывании EOF Х принимает значение end_of_file.

?- read(X). элемент(Y,L).

X = элемент(Y,L).

write(X) - вывод терма в выходной поток в видимой форме.

read (<имя_потока>,X) - ввод/вывод в/из потока

write(<имя_потока>,X) -

Для форматирования вывода используются также предикаты

TAB(N) (от слова табуляция) и nl (new line).

 tab(N) - вывести в выходной поток N пробелов

tab(<имя_потока>,N)

 nl  - заносит в текущий выходной поток 'ВК'/EOL

  nl(<имя_потока>)

5.13.3 Примеры применения предикатов ввода-вывода

ПРИМЕР 1: Вывод списка - непрерывный; построчный.

непрерывный_вывод_списка( [] ).

непрерывный_вывод_списка( [A|L] ):-

write(A), tab(1),

непрерывный_вывод_списка(L).

построчный_вывод_списка( [] ).

построчный_вывод_списка( [A|L] ):-

write(A), nl,

построчный_вывод_списка(L).

ПРИМЕР 2: рейс(Ном, Откуда, Куда, Прилет, Отлет)

write(рейс(Ном, Откуда, Куда, Прилет, Отлет)).

вывод_на_экр_рейс(рейс(Ном, Откуда, Куда, Прилет, Отлет)):-

write(Откуда), write(' ---> '), write(Куда),nl,

write('Номер рейса'), write(Ном), nl,

write('Время вылета'), выв_время(Отлет), nl,

write('Время прилета'), выв_время(Прилет).

выв_времени( [Часов|Минут] ) :-

write(Часов), write(' часов '), write(':'),

write(Минут), write(' минут ').

ВЫВОД :

Симферополь ---> Москва

Номер рейса : А-20

Время вылета: 11 часов : 20 минут

Время прилета: 11 часов : 22 минут

ПРИМЕР 3: Пусть существует БД вида

адрес( Имя, Адрес ).

вывод_на_экран_адреса :-

repeat, write(' Введите имя '), nl,

read( Имя ),

( Имя = end, !;

адрес( Имя, Адрес),

write( Адрес ), nl, fail ).

ПРИМЕР 4:

чтение_файла :-

repeat, read(T),

( T = end_of_file, !;

обработка(T), fail ).

ПРИМЕР 5: Программа калькулятора .

вычислить :-

write('Введите выражения'), nl,

read(Выражение), обработка(Выражения).

обработка(end):- !.

обработка(Выражение):-

Res is Выражение,

write('Значение'), write(Res),

вычислить.

5.14 Предикат name

Часто желательно информацию, считанную как последовательность символов, представить в программе в виде атома или наоборот. Для этого используется предикат name.

name(A,L) - истинно, если L - список ASCII-кодов

объекта А.

?- name(help,L). ?- name(X, [100,87,...]).

L = [100,87,...] X = help

Существует два типичных случая использования name:

- необходимо разбить атом на символы;

- необходимо объединить символы в атом.

ПРИМЕР : Часто необходимо вводить из файла строку - пос ледовательность символов - до символа EOL. Все что вводится д.б. значением 1-ой переменной .

ввод_строки( Строка ):-

get0(C),

( C = 13;

ввод_символа(С, Список),

name( Cтрока, Список ) ), !.

ввод_символа(13,[]) :- !.

ввод_символа(С, [ C|Остаток ]):-

get0(C1), ввод_символа(C1, Остаток).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]