Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Глава 13. Обработка строк в турбо прологе

Турбо Пролог поддерживает различные стандартные предикаты для мощной

и эффективной обработки строк. В этой главе мы разделили их на 2 группы:

семейство базовых предикатов управления строками и ряд предикатов, ис-

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

Обработка строк

При работе со строками нужно помнить, что Турбо Пролог распознает

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

'a' '3'

'*' '{'

'W' 'A'

В строках Турбо Пролога слеш (\) является escape-символом. Чтобы на-

печатать именно символ слеш, вы должны набрать их дважды. Например, чтобы

указать имя DOS A:\TPROLOG2\MYPROJS\ MYFILE.PRO в программе на Турбо Про-

логе, мы должны написать a:\\tprolog2\\myprojs\\myfile.pro.

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

Предикаты, описываемые в этом разделе, являются основой обработки

строк в Турбо Прологе; они служат для нескольких целей:

- разделения строки на подстроки и лексемы;

- построения строки из определенных подстрок и лексем;

- проверки, состоит ли строка из определенных подстрок или

лексем;

- возврата строки, лексемы, или списка их из данной строки;

- проверки или определения длины строки;

- создания пустой строки определенной длины;

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

Прологе;

- преобразования переменного числа аргументов в строковую

переменную.

Frontchar/3

frontchar действует согласно равенству:

String1=the concatnation of CharArg and String2

и имеет следующий формат:

frontchar (String1,CharArg,String2)

/* (i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i) */

frontchar имеет 3 аргумента: первый из них - строка, второй - символ

(первый символ первой строки), третий - остаток первой строки.

frontchar можно использовать для расщепления строки в последователь-

ность символов или для создания строки из последовательности символов, а

также для проверки символов в строке. Если аргумент String1 связан со

строкой нулевой длины, то предикат завершается неудачно.

Пример

В программе CH13EX01.PRO, frontchar используется для определения

предиката, преобразующего строку в список символов. Задайте цель:

string_chlist("ABC",Z)

После обработки целевого утверждения Z будет связано со списком

['A','B','C']

/* Program CH13EX01.PRO */

domains

charlist = char*

predicates

string_chlist(string, charlist)

clauses

string_chlist("", []).

string_chlist(S, [H|T]) :-

frontchar(S, H, S1), string_chlist(S1, T).

Fronttoken/3

fronttoken выполняет 3 взаимосвязанные функции, в зависимости от ти-

па модели потока, который используется для обращения к нему.

fronttoken(String1,Token,Rest)

/* (i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i) */

В случае потока (i,o,o) fronttoken находит первую лексему String1,

связывает ее с Token, а остаток String1 связывает с Rest. Варианты потока

(i,i,o),(i,o,i), а также (i,i,i) служат для проверки; если связанные ар-

гументы соответствуют частям String1 (первой лексеме, всему, что находит-

ся после первой лексемы, или же им обоим), то fronttoken завершается ус-

пешно, в противном случае - неудачно.

В случае, если использован поток (o,i,i,), предикат создает объеди-

нение Token и Rest, связывая String1 с результатом.

Последовательность знаков является одной лексемой, если она удовлет-

воряет следующим условиям:

- либо это имя в соответствии с синтаксисом Турбо Пролога;

- либо это число (предшествующий ему знак является отдельной

лексемой);

- либо это отличный от пробела знак.

fronttoken отлично приспособлен для разбиения строки на лексические

символы.

Пример

Программа CH13EX02.PRO иллюстрирует способ использования предиката

fronttoken для разбития предложения на список имен. Если задать целевое

утверждение:

string_namelist("bill fred tom dick harry",X).

то после обработки параметров Х будет связано со списком:

(bill, fred, tom, dick, harry)

/* Program CH13EX02.PRO */

domains

namelist = name*

name = symbol

predicates

string_namelist(string, namelist)

clauses

string_namelist(S, [H|T]) :-

fronttoken(S, H, S1), !,

string_namelist(S1, T).

string_namelist(_, []).

Соседние файлы в папке Документация