Обработка строк в Prolog выполняется с помощью встроенных предикатов. Рассмотрим основные предикаты управления строками.
Строки и их обработка подчиняются определенным правилам. Так, в строках Visual Prolog обратный слэш (\) является управляющим символом, позволяющим вставлять в строки символы, которых нет на клавиатуре.
Предикат frontChar
Предикат frontChar
действует согласно равенству: String1
= объединение Char
и String2
и имеет следующий формат:
frontChar (Stringl, Char, String2).
Предикат frontChar имеет три аргумента: первый из них – строка, второй – символ (первый символ первой строки), третий – остаток первой строки.Предикат
frontChar
можно использовать для расщепления строки в последовательность символов или для создания строки из последовательности символов, а также для проверки символов в строке. Если аргумент String1
связан со строкой нулевой длины, то предикат завершается не успешно.
Предикат 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 с результатом.
Последовательность знаков является лексемой, если это либо имя в соответствии с синтаксисом Visual Prolog, либо число (предшествующий ему знак является отдельной лексемой), либо отличный от пробела знак.
Предикат
frontToken
отлично приспособлен для разбиения строки на лексические символы.
Предикат 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)
Предикат
create
связывает переменную Str
с длиной строки Length
. То есть есть Srt1
не задана, то создается пустая строка длинной Length
, в другом случае в Str
записывается строка Str1
и дублируется пока не будут заполнены все Length
-символов.
Предикат 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).
В примере формат "%8.3f\n" означает, что нужно отобразить действительное число и выполнить возврат каретки; ширина поля, отведённого для числа, равна 8 знакам, число должно быть отображено с тремя знаками после запятой. Формат "%010d\n" выражает требование целого числа, выровненного по правому краю поля шириной 10; пустые места поля должны быть заполнены нулями. Формат "%-10d\n" определяет представление целого числа, выровненного по левому краю поля шириной 10; знак минус указывает на левое выравнивание, правое выравнивание установлено по умолчанию. Формат "%10.1e\n" определяет научную запись для действительных чисел.Далее приведён список типов данных, принимаемых форматируемой строкой. Заметим, что при конвертации действительных чисел в текстовое представление они обрезаются и округляются до 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)
Переменная Str_out
будет связана с копией части строки Str_in
, начиная с символа на позиции Роs
и длиной Len
. Например: SubStr = subString("GOLORP", 1, 3)
связывает SubStr
с "OLO". Если Pos
и Len
задают строку частично или полностью вне границ Str_in
, то subString
завершается с ошибкой. Однако запрос 0 байт на самом конце строки не является ошибкой: 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).