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

38. Преобразование строк в списки атомов с функторами.

Часто удобно преобразовывать данные, введенные с клавиатуры, в термы, которые могут быть обработаны Турбо-Прологом. Например, вам может потребоваться поместить множество утверждений в базу данных в следующем виде:

fruit(apple).

fruit(peach).

fruit(orange).

fruit(pear).

Эти утверждения могут быть построены на основе строки apple peach orange pear. Этот метод включает преобразование строки в список, который содержит имя функтора. В данном случае имя функтора есть fruit (фрукт). Результатом преобразования является следующий список:

[fruit(apple),fruit(peach),fruit(orange),fruit(pear)].

Этот список может быть записан в базу данных (или файл).

Соответствующее правило на Турбо-Прологе может быть построено таким образом, чтобы каждый элемент этого списка находился на отдельной строке. Это правило должно присоединять точку к каждому элементу с функтором. После построения правила для записи списка необходимо построить правило преобразования. Предикат fronttoken (встроенный предикат для извлечения атома из строки) является основной компонентой этого правила. Для соответствующего примера будет использоваться transf. Это правило должно удовлетворять нескольким требованиям. Во-первых, оно должно отображать пустую строку в пустой список:

transf("", []).

В начальный момент преобразования это правило должно быть успешным при пустом списке. Цель этого правила состоит в трансформации строки в список. Во время этого процесса правило также проверяет тип каждого элемента. Если элемент является целым числом, то выбирается имя функтора n; если элемент является символом, то имя функтора есть ch; если элемент является строкой, то имя функтора s. Целиком это рекурсивное правило имеет следующий вид:

transf(Str, [Token_head|Token_tail]) :-

fronttoken(Str, Symbol_type, Strx),

choose_token(Symbol_type, Token_head),

transf(Strx, Token_tail).

Подправило chose_token имеет вид:

choose_token(S,n(N)) :- str_int(S,N).

choose_token(S,c(C)) :- str_char(S,C).

choose_token(S,s(S)) :- isname(S).

Правило transf допускает строки, состоящие из символов и чисел. Когда это правило вызывается, значение Symbol_type может быть числом, символом или именем. Если это число, то choose_token определяет этот тип, и тогда Token_head имеет вид n(N), где N - число. Если объект является символом, то правило choose_token присваивает Token_head строку вида c(C), где C - символ. Если объект является строкой, то Token_head имеет вид s(S), где S - строка.

39.Предикаты Пролога для работы с файлами. Использование предикатов для работы с файлами.

Предикаты Турбо-Пролога для работы с файлами

В системе Турбо-Пролог имеются следующие предикаты для

работы с файлами:

deletefile уничтожение файла

save сохранение файла на диске

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

existfile тест на наличие файла с данным именем

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

disk выбор дисковода и пути доступа

dir выдача каталога директории

Кратко опишем, как работают предикаты для работы с фай-

лами. В приведенных ниже примерах file_domain является опи-

сываемым пользователем файловым доменом (как это сделать,

будет пояснено в следующем разделе), а DOS_filename - име-

нем, под которым файл фигурирует в директории на диске. В

том случае если пример не очевиден, он снабжается пояснения-

ми.

deletefile(DOS_filename)

save(DOS_filename) Сохраняет на диске утверждения ди-

намической базы данных (смотри гл. 9).

renamefile(Old_DOS_filename,New_DOS_filename)

existfile(DOS_filename) Предикат успешен в случае, если

файл с именем, заданным переменной DOS_filename, присутству-

ет в директории.

flush(file_domain) Этот предикат сбрасывает содержимое

внутреннего буфера, отведенного для данного устройства запи-

си.

disk(Path) Если переменной Path присвоен корректный

путь доступа (смотри приложение С), то заданная с его по-

мощью директория становится текущей. Если же переменная Path

не означена, то данный предикат присваивает Path путь досту-

па к текущей директории.

dir(Path,File_spec,File_name) Переменной Path должен

быть присвоен корректный путь доступа, переменная File_spec

задает расширение представляющей интерес группы файлов. Дан-

ный предикат выдает каталог имен файлов с заданным расшире-

нием; вы можете выбрать среди них нужный и нажать Enter. Имя

файла будет присвоено переменной File_name.

Помимо перечисленных предикатов Турбо-Пролог также под-

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

кации файла и тому подобные. Эти предикаты будут рассмотрены

позднее.