Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_РЛП_4_форм.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
644.61 Кб
Скачать

3.10.Встроенные предикаты языка пролог

Ввод и вывод

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

see(ИмяФайла) - заменяет текущий входной поток на другой файл;

tell(ИмяФайла) - заменяет текущий выходной поток на другой файл;

seen - закрывает текущий входной файл;

told - закрывает текущий выходной файл.

Файлы обрабатываются последовательно. Каждый запрос на чтение из входного файла приводит к чтению в текущей позиции текущего входного потока. После этого текущая позиция будет перемещена на следующий симол. Если запрос на чтение делается в конце файла, то в качестве ответа на такой запрос выдается атом end_of_file.

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

Если Х - переменная, то в результате Х конкретизируется и становится равным Т. Если сопоставление терпит неудачу, цель read(X) тоже терпит неудачу.

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

Х будет выведен в той же форме, в какой пролог-система изображает значения переменных.

tab(N) - выводит N пробелов;

nl - приводит к переходу на новую строку.

Пример 3.10.1. Представление списка целых чисел в виде диаграммы.

Описание программы:

диагр([N | L]):- звездочки(N), n1, диагр(L).

диагр([]).

звеэдочки(N):- N > 0, write(*), Nl is N - 1, звездочки(Nl).

звездочки(N):- N<=80.

Пример использования:

?- диагр( [3, 4, 6, 5]).

***

****

******

*****

get0(С) - читать символ из текущего входного потока;

get(С) - читать символ из текущего входного потока c пропускjv всех непечатаемых символов (в частности пробелов);

put(С) - вывести символ в текущий выходной поток.

Проверка типов термов

Следующие предикаты заканчиваются успешно, если:

var(X) - Х в текущий момент не получила значения;

nonvar(X) - Х - терм, отличный от переменной, или если Х - уже получила значения;

atom(X) - Х обозначает атом или переменную, имеющую атом в качестве значения;

integer(X) - Х обозначает целое или переменную, имеющую целое в качестве значения;

atomic(X) - Х обозначает целое или атом или переменную, имеющую такие значения.

Пример 3.10.2. Вычисление недостающего элемента в равенстве X=Y+Z.

Описание программы:

сумма(X,Y,Z):- integer(X), integer(Y), Z is X-Y.

сумма(X,Y,Z):- integer(Z), integer(Y), X is Y+Z.

сумма(X,Y,Z):- integer(X), integer(Z), Y is X-Z.

Пример использования:

?- сумма(X,2,3).

X=5

?- сумма(2, X,3).

X=-1

?- сумма(2,3, X).

X=-1

Создание и декомпозиция термов

Инфиксное отношение «=..» сопоставляет структуру со списком.

Предикат «Терм =.. L.» заканчивается успешно, если L - список, начинающийся с главного функтора терма Терм, вслед за которым идут его аргументы.

Пример 3.10.3.

?- f(а, b) =..L.

L=[f, а, b]

?- а=..L.

L=[а]

?- Т=..[прямоугольник, 3, 5].

Т=прямоугольник( 3, 5)

?- Z=..[р, X, f( X,Y)].

Z = p(X, f(X,Y))

functor(Терм, F, N) заканчивается успешно, если F - главный функтор Tepмa, а N -арность F.

arg(N, Терм, А) заканчивается успешно, если А - N-й аргумент в Терме.

Пример 3.10.4.

?- functor( t( f( x), X, t), Фун, Арность).

Фун = t

Арность = 3

?- аrg( 2, f( X, t( a), t( b) ), Y).

Y = t( a)

?- functor( D, дата, 3), arg( 1, D, 29), arg( 2, D, июнь), arg( 3, D, 1982).

D = дата( 29, июнь, 1982)

name(A, L) заканчивается успешно, если L - список кодов символов, входящих в состав атома А.

Пример 3.10.5.

?- name(abcbd,L).

L = [97, 98, 99, 98, 100]

?- name(X,[97, 98, 99, 98, 100]).

X = abcbd

?- name(A,[a,b,c,d]).

X = abcd