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

1.7 Стандартные предикаты обработки строк

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

Предикат frontchar(string, char, string) предназначен для отделения символа от строки. Его аргументы в порядке записи имеют следующее содержание: входная строка, отделенный символ, строка–остаток. Следует обратить внимание на то, что предикаты этой группы могут работать в разных режимах в зависимости от конкретной формы применения, т.е. от содержания аргументов. Так, в контексте

frontchar(problem,X,Y) X=p,Y=roblem,

а при вызове

frontchar(X,p,roblem) X=problem.

Предикат frontsrt(integer, string, string, string) отделяет от начала строки указанное количество символов. Содержание его аргументов аналогично рассмотренному случаю. Например,

frontstr(4,”программа”,X,Y) X=“прог”,Y=“рамма”.

Определить количество символов в строке можно с помощью предиката str_len(integer, string). Так,

str_len(X, “функция”) X=7.

Назначением предиката fronttoken(string, string, string) является обособление первой лексемы в предложении. Лексема – это слово, формальное или фактическое (последовательность однотипных символов). Украинские буквы от “a” до “я” воспринимаются как символы раздела. Как будет показано ниже, этот предикат является довольно эффективным при преобразовании строк в списки.

fronttoken(sin(x), L, S) L=sin, S=(x).

Для соединения двух строк применяется предикат

conc(string, string, string). Так, для двух форм конкретизации аргументов имеем

conc(“чемпион”, “мира”, X) X=“чемпион мира”.

conc(“чемпион”, X, “чемпион мира”) X=“мира”.

Для взаимного преобразования типов string - integer используется предикат str_int(string, integer). Так, при вызове str_int(“3”, X) имеем X=3.

1.8 Средства ввода и вывода. Работа с файлами.

Средства ввода и вывода данных принадлежат к внелогическим предикатам Пролога, так как они формально не являются предикатами. К ним принадлежат: предикаты readreal(X), readint(X) и readln(X), предназначенные соответственно для чтения целого, действительного числа и строк. Предикат readchar(X) читает символ. Как известно, прочитанный символ может быть:

символом, который имеет отображение на экране;

управляющим символом (который не имеет отображения на экране и выполняет какое-то действие).

Символ, прочитанный предикатом readchar, относится к таким, которые не имеют отображения на экране независимо от символа, который вводится, и может использоваться для введения паролей.

Для ввода термов (констант, переменных, структур) используется предикат

readterm(тип терма, терм),

что позволяет вводить любые структуры.

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

writef(формат-строка, последовательность объектов вывода).

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

nl – переход в строке вывода на новую строчку.

Рассмотрим пример введение структуры с помощью предиката readterm с ее дальнейшим выводом в форматной форме

domains

address = street(string,integer)

predicates read_write

clauses read_write:-rеadterm(address, street(X,Y)),

writef(“улица ‘%s‘ дом N ‘%u’”, X, Y).

goal read_write.

Для значений X=“Шевченко”, Y=3 на экране будет отображена строка

улица Шевченко дом N 3.

Управляющий символ % показывает, что вывод следующего объекта из последовательности будет осуществляться в обозначенном формате

%s – строка;

%c – символ;

%u – целое без знака;

%d – обычное десятичное число.

Символ “-” указывает на выравнивание строки по левому краю.

Файлы

Программа на Прологе может взаимодействовать с несколькими файлами или устройствами. Но одновременно могут быть активными только два файла или устройства – один входной и один выходной.

При использовании в программе файлов ее необходимо снабдить описанием файлового домена, которое выглядит так:

file=datafile,

где file – стандартный тип домена (файловый),

datafile – логическое имя файла.

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

file=datafile1; datafile2; datafile3

Открытие файла выполняется стандартными предикатами:

openread(name_log, name_fis) – для последовательного чтения файла;

openwrite(name_log, name_fis) – для последовательной записи в новый файл; или замены содержимого существующего файла;

openappend(name_log, name_fis) – для работы с файлами прямым методом доступа (чтение и запись).

Здесь name_log, и name_fis соответственно символическое имя логического файла в программе и имя физического файла на диске.

Имя файла на диске задается в виде строки, в которой не допускается задавать устройство и путь к каталогу. Замена текущего диска и каталога выполняется с помощью стандартного предиката disk. После открытия файла все предикаты Пролога, синтаксис которых требует имени файла, работают с символическим именем. Символическое имя объявляется в разделе domains и в программе можно объявлять несколько символических имен для логических файлов.

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

Кроме перечисленных выше предикатов при работе с файлами могут использоваться следующие встроенные предикаты Турбо-Пролога:

deletefile – удаления файла,

save – сохранения файла,

renamefile – переименования файла,

existfile – проверки наличия файла,

flush – сброса данных из внутреннего файлового буфера в заданный файл,

disk – установки накопителя и пути,

dir – вывода текущего каталога,

openmodify – открытия файлов для чтения/записи,

closefile – закрытия файла,

eof – проверки на конец файла,

filemode – установки или чтения типа файла,

filepos – установки или чтения позиции указателя в файле,

file_str – чтения строки из файла.

Логические устройства ТП. Для указания логическому устройству чтения, откуда вводить данные, используют стандартный предикат

readdevice(name_f),

а для указания логическому устройству записи, куда выводить данные – предикат

writedevice(name_f).

Предикаты применяют после открытия файла. Эти же предикаты используют для переназначения логического устройства на другой файл или устройство. ТП использует такие стандартные имена логических устройств

printer – принтер;

screen – экран;

keyboard – клавиатура.

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

Например, при записи данных в файл последовательность действий следующая:

– открытие файла с помощью предиката openwrite;

– назначение файла в качестве устройства записи предикатом writedevice;

– сама запись в файл, например, с помощью предикатов write или writef;

– использование любых других предикатов и правил, отвечающих назначению программы;

– закрытие файла предикатом closefile.

Все эти действия в программе могут быть описаны следующим образом:

openwrite(datafile1,”File1.dat”),

writedevice(datafile1),

<запись в файл>

<любые другие правила или предикаты>

closefile(datafile1).

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

Дополнение

Программа, осуществляющая считывание данных с клавиатуры и запись их в файл, может выглядеть так:

domains

file=datafile

kstr,fstr=string

predicates

readin(kstr,fstr) /* чтение-запись */

create_a_file /* создание файла */

goal

create_a_file.

clauses

create_a_file:-

nl,nl,write(“Введите имя файла”),nl,nl,

readln(Filename),

openwrite(datafile,Filename),

writedevice(datafile),

readln(Kstr),/* ввод первой строки с клавиатуры */

concat(Kstr,”\13\10”,Fstr),

readin(Kstr,Fstr),

closefile(datafile).

/* Ввод последующих строк и запись их в файл */

readin(“stop”,_):-!.

readin(_,Fstr):- write(Fstr),readln(Kstr1),

concat(Kstr1,”\13\10”,Fstr1),

readin(Kstr1,Fstr1).

В приведенной программе

Kstr – строка, вводимая с клавиатуры,

Fstr – строка, выводимая в файл.

Содержимым файла Filename будут дополненные символами “\13\10” вводимые пользователем строки. Дополнение строки символами “\13\10” необходимо для того, чтобы предикат readln мог различать строки при считывании их из файла в дальнейшем. Работа программы заканчивается, если введена строка “stop”.

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