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

11. Особенности ввода-вывода в языке Пролог.

Чтение символов

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

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

get0(X)

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

get(X)

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

skip(X)

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

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

Для вывода символов используются системные предикаты: put(X), tab(X) nl. Они определяются следующим образом.

put(X)

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

tab(X)

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

nl

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

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

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

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

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

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

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

put(‘e’+’A’-‘a’) выводится символ Е

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

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

Предикаты

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

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

read(X)

Если переменная неконкретизирована, то она означивается тер­мом, считанным с терминала. Попытка пользователя напечатать вы­ражение, не являющееся термом, приведет к ошибке. Вводимая ин­формация должна заканчиваться точкой. В случае, если переменная 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.

Запись термов

Рассмотрим предикаты, служащие для записи термов.

write(X)

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

?- write(cyммa(N,S,N+l)).

на экране появится

сумма (_35,_36 is_35+l ) .

writeq(X)

Предикат аналогичен предикату write(X) кроме случая, когда X содержит атом или функторы, которые в программе следует заклю­чать в кавычки. Предикат writeq записывает такие величины на эк­ране в кавычках. Например, в результате запроса

?- writeq('fred.txt').

на экране появится

'fred.txt'

display (X)

Предикат выводит терм X в стандартной скобочной префиксной

форме записи. Например, запрос

?- display (X+Y).

вызовет появление на экране записи:

+ (X,Y)