Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

9.3. Особенности ввода и вывода чтение символов

Системные предикаты get(X), get0(X), skip(X) служат для ввода символов с терминала пользователя. Коды символов различаются в зависимости от используемой реализации Пролога. В микрокомпью­терах в основном применяется код ASCII, а в больших ЭВМ (таких, как ICL2900) - код EBDIC.

Перечисленные предикаты определяются следующим образом.

get0(X)

Предикат вызывает считывание одного символа с клавиатуры. Если переменная Х неконкретизирована, то Х принимает значение кода символа. Если же переменная Х конкретизирована, то вводи­мый символ сопоставляется с X. Целевое утверждение будет успешно доказано только в том случае, если символ сопоставим с X.

get(X)

Предикат вызывает считывание одного или нескольких символов с клавиатуры до тех пор, пока не будет считан символ пробела. Если переменная Х неконкретизирована, то код символа отождествляется с Х и доказательство утверждения заканчивается успехом. Если же переменная Х конкретизирована, целевое утверждение будет дока­зано только в случае, если вводимый символ сопоставим с X.

skip(X)

Предикат считывает символы с клавиатуры или из текущего входного файла, пока не встретится символ с кодом X, тогда доказа­тельство цели заканчивается успешно. Переменная Х может быть целочисленным выражением.

Запись символов

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

put(X), tab(X) и nl.

Они определяются следующим образом.

put(X)

Символ с кодом Х записывается на терминал. Допускается, что­бы Х был целочисленным выражением. Доказательство целевого ут­верждения put(X) всегда заканчивается успехом. Х может быть ко­дом как управляющего, так и алфавитно-цифрового символа.

tab(X)

На терминал выводится Х пробелов. Х может быть целочислен­ным выражением.

nl

Происходит переход на новую строку терминала.

Рассмотрим примеры:

put(65) на терминал выводится символ A

(подразумевается ASCII код)

put(66+32) выводится символ b

put('C') выводится символ С

put([100]) выводится символ d

put('e'+'A'-'a') выводится символ E

put(a(b)) выдается сообщение об ошибке

Считывание термов Предикаты

read(X), readb(X) и read(X,Y)

служат для считывания термов. Приведем их определение.

read(X)

Если переменная неконкретизирована, то она означивается тер­мом, считанным с терминала. Попытка пользователя напечатать вы­ражение, не являющееся термом, приведет к ошибке. Вводимая ин­формация должна заканчиваться точкой. В случае, если переменная Х конкретизирована термом, попытка доказать целевое утверждение заканчивается успехом только при условии, что вводимый с терми­нала терм сопоставим с X. В противном случае попытка доказатель­ства завершается неудачей.

readb(X)

Данный предикат аналогичен предикату read(X), но вводимый терм не должен заканчиваться точкой.

read(X,Y)

Доказательство предиката завершается успехом, если считывае­мый терм отождествляется с X, и неудачей в противном случае. При успешном доказательстве переменная Y становится списком, состоя­щим из имен переменных, входящих в терм X. Пролог переименовы­вает переменные, встретившиеся в вводимом терме. Таким образом, когда попытка доказать целевое утверждение read(X,Y) заканчива­ется успехом, список Y содержит внутренние имена переменных, входящих в терм X. Как и при использовании предиката read(X), по­сле вводимого терма должна стоять точка.

readb(X,Y)

Предикат аналогичен предикату read(X,Y). Различие состоит в том, что пользователь не должен печатать точку после ввода терма.

Примеры:

После запроса:

?- read(X).

система ожидает ввода. Если пользователь напечатает:

test(5).

то в результате переменная Х получит значение

X=test(5)

Задав вопрос

?- read (джек(мужчина)).

и введя терм

test.

получим ответ:

нет.

При запросе:

?- read(X,Y).

вводим терм

fred(P,a(Q)).

в результате получаем

X=fred(_55,a(_57))

Y=[[P | _55],[Q | _57]],

где _55 - внутреннее имя переменной Р, а _57 - внутреннее имя пере­менной Q.

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