Обработка строк в Prolog выполняется с помощью встроенных предикатов. Рассмотрим основные предикаты управления строками.
Строки и их обработка подчиняются определенным правилам. Так, в строках Visual Prolog обратный слэш (\) является управляющим символом, позволяющим вставлять в строки символы, которых нет на клавиатуре.
Предикат frontChar
Предикат frontChar
действует согласно равенству: String1
= объединение Char
и String2
и имеет следующий формат:
frontChar (Stringl, Char, String2).
![](http://primat.at.ua/_pu/14/s97949131.jpg)
Предикат
frontChar
можно использовать для расщепления строки в последовательность символов или для создания строки из последовательности символов, а также для проверки символов в строке. Если аргумент String1
связан со строкой нулевой длины, то предикат завершается не успешно.![](http://primat.at.ua/_pu/14/s94304935.jpg)
Предикат frontToken
Предикат frontToken
выполняет три взаимосвязанные функции, в зависимости от типа потока аргументов, который используется для обращения к нему.
frontToken (Stringl, Token, Rest)
В случае потока (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 с результатом.
![](http://primat.at.ua/_pu/14/s55332390.jpg)
Последовательность знаков является лексемой, если это либо имя в соответствии с синтаксисом Visual Prolog, либо число (предшествующий ему знак является отдельной лексемой), либо отличный от пробела знак.
Предикат
frontToken
отлично приспособлен для разбиения строки на лексические символы.![](http://primat.at.ua/_pu/14/s99068874.jpg)
Предикат front
Предикат front
расщепляет String1
на две части. Синтаксис предиката:
front(String1, NumberOfChars, StartStr, EndStr)
где StartStr
содержит NumberOfChars
первых символов из String1
, a EndStr
содержит остаток.
Предикат concat
Предикат concat
устанавливает, что строка StringS
является результатом сцепления String1
и String2
. Он имеет форму:
StringS = concat(String1, String2)
Например, мы вызываем
Str = concat("croco", "dile")
, тогда Str = "crocodile"
.
Предикат length
Предикат length
определяет длину строки. Он имеет формат:
Length = length(StringArg)
Предикат length
связывает переменную Length
с длиной строки StringArg
. Length
имеет тип charCount
.
Предикат create
Предикат create
создает строку указанной длинны. Он имеет формат:
Str = create(Length) или Str = create(Length, Str1)
![](http://primat.at.ua/_pu/14/s63100396.jpg)
Предикат
create
связывает переменную Str
с длиной строки Length
. То есть есть Srt1
не задана, то создается пустая строка длинной Length
, в другом случае в Str
записывается строка Str1
и дублируется пока не будут заполнены все Length
-символов.![](http://primat.at.ua/_pu/14/s12342203.jpg)
Предикат isName
Предикат isName
проверяет, является ли аргумент допустимым именем согласно синтаксису Visual Prolog, и имеет формат:
isName(String)
Имя начинается с буквы алфавита или символа подчеркивания, за которым следует любое число букв, цифр и символов подчеркивания. Предыдущие и последующие пробелы игнорируются.
Предикат format
Если вы хотите правильно отформатировать числа или другие простые термы при преобразовании их в строку, вы можете использовать функцию форматирования format
.
Рассмотрим пример:
implement main
open core, console, string
clauses
run():-
init(),
Str1= format("%8.3f\n %10.1e\n", 3.45678, 35678.0),
Str2= format("%d\n %10d\n", 456, 18),
Str3= format("%-10d\n %010d\n", 18, 18),
write(Str1, Str2, Str3),
_ = readLine().
end implement main
goal
mainExe::run(main::run).
![](http://primat.at.ua/_pu/14/s99207722.jpg)
Далее приведён список типов данных, принимаемых форматируемой строкой. Заметим, что при конвертации действительных чисел в текстовое представление они обрезаются и округляются до 17 цифр, если не была указана другая точность.
• f – форматировать как действительное число с фиксированной запятой (как 123.4);
• e – форматировать действительное число в экспоненциальной записи (как 1.234e+002);
• g – форматировать в либо формате f, либо в формате e — как запись будет короче;
• d – форматировать как знаковое целое;
• u – форматировать как беззнаковое целое;
• x – форматировать как шестнадцатеричное число;
• o – форматировать как восьмеричное число;
• c – форматировать как символ;
• B – форматировать как двоичный тип Visual Prolog;
• R – форматировать как номер ссылки базы данных;
• P – форматировать как параметр процедуры;
• s – форматировать как строку.
Предикат subСhar
Предикат subСhar возвращает символ на данной позиции строки:
Char = subChar(String, Position)
Первый символ строки имеет позицию 1. Например: Char = subChar("ABC", 2)
свяжет Char
с C
, так как отсчет начинается с нуля. Если позиция определяет символ за концом строки (несуществующий символ), subChar
завершится с ошибкой.
Предикат subString
Предикат subString
возвращает часть строки. Его формат:
Str_out = subString(Str_in, Pos, Len)
![](http://primat.at.ua/_pu/14/s39480435.jpg)
Str_out
будет связана с копией части строки Str_in
, начиная с символа на позиции Роs
и длиной Len
. Например: SubStr = subString("GOLORP", 1, 3)
связывает SubStr
с "OLO". Если Pos
и Len
задают строку частично или полностью вне границ Str_in
, то subString
завершается с ошибкой. Однако запрос 0 байт на самом конце строки не является ![](http://primat.at.ua/_pu/14/s04056288.jpg)
SubStr = subString("ABC", 4, 0)
свяжет SubStr
с пустой строкой, тогда как SubStr = subString("ABC", 4, 1)
является ошибкой, так же, как и SubStr = subString("ABC",5,-1)
.
Далее приведен список других предикатов, которые могуть быть полезны при разработке ваших приложений. В них параметры adjustBehaviour, adjustSide и case-Sensivity имеют следующие определения:
domains
adjustBehaviour = expand(); cutRear(); cutOpposite().
adjustSide = left(); right().
caseSensitivity = caseSensitive();
caseInsensitive();
casePreserve().
adjust : (string Src, charCount FieldSize, adjustSide Side) -> string AdjustedString.
adjust : (string Src, charCount FieldSize, string Padding, adjustSide Side) -> string AdjustedString.
adjustLeft : (string Src, charCount FieldSize) -> string AdjustedString.
adjustLeft : (string Src, charCount FieldSize, string Padding) -> string AdjustedString.
adjustRight : (string Src, charCount FieldSize) -> string AdjustedString.
adjustRight : (string Src, charCount FieldSize, string Padding) -> string AdjustedString.
adjustRight: (string Src, charCount FieldSize, string Padding, adjustBehaviour Behaviour) -> string AdjustedString.
concatList: (core::string_list Source) -> string Output procedure (i).
concatWithDelimiter: (core::string_list Source, string Delimiter) -> string Output procedure (i,i).
createFromCharList: (core::char_list CharList) -> string String.
equalIgnoreCase: (string First, string Second) determ (i,i).
getCharFromValue: (core::unsigned16 Value) -> char Char.
getCharValue : (char Char) -> core::unsigned16 Value.
hasAlpha: (string Source) determ (i).
hasDecimalDigits : (string Source) determ (i).
hasPrefix : (string Source, string Prefix, string Rest) determ (i,i,o).
hasSuffix : (string Source, string Suffix, string Rest) determ (i,i,o).
isLowerCase : (string Source) determ (i).
isUpperCase : (string Source) determ (i).
isWhiteSpace : (string Source) determ.
lastChar : (string Source, string First, char Last) determ (i,o,o).
replace: (string Source, string ReplaceWhat, string ReplaceWith, caseSensitivity Case) -> string Output procedure
replaceAll : ( string Source, string ReplaceWhat, string ReplaceWith) -> string Output.
replaceAll : ( string Source, string ReplaceWhat, string ReplaceWith, caseSensitivity Case) -> string Output.
search: (string Source, string LookFor) -> charCount Position determ (i,i).
search: (string Source, string LookFor, caseSensitivity Case) -> charCount Position determ (i,i,i).
split: (string Input, string Separators) -> string_list.
split_delimiter : (string Source, string Delimiter) -> core::string_list List procedure (i,i).
subString : (string Source, charCount Position, charCount HowLong) -> string Output procedure (i,i,i).
/*Конвертирует буквы в строке в строчные*/
toLowerCase : (string Source) -> string Output procedure (i).
/*Конвертирует буквы в строке в прописные*/
toUpperCase : (string Source) -> string Output procedure (i).
/*Удаляет предшествующие и последующие строке пробелы.*/
trim : (string Source) -> string Output procedure (i).
/*Удаляет предшествующие строке пробелы.*/
trimFront : (string Source) -> string Output procedure (i).
/*Удаляет группы пробелов из строки Source.*/
trimInner : (string Source) -> string Output procedure (i).
/*Удаляет следующие за строкой пробелы.*/
trimRear : (string Source) -> string Output procedure (i).