Predicates
St (string) find_length /* найти длину строки st */ Goal Find_length. Clauses st(«Темы практических занятий:»). st(«- введение в язык PDC Prolog;»). st(«- правила;»). st(«- структуры;»). st(«- арифметика;»). st(«- рекурсия;»). st(«и т.д.»). find_length:- St (S), str_len (S,L), write(S, «(», L, «)»), nl, fail.
КОНКАТЕНАЦИЯ СТРОК Под этой операцией подразумевается объединение исходных строк с целью образования одной новой строки: concat (String1, String2, String3) (i,i,o),(o,i,i),(i,o,i),(i,i,i).
При использовании по «прямому» назначению встроенного предиката concat объекты String1 и String2 являются входными строками, а String3 - объединенная выходная строка.
Следующий пример 5.2 демонстрирует объединение четырех строк: - 191186, - Санкт-Петербург, - ул. Миллионная, 5, - СЗПИ. В этом примере строки представлены односимвольными переменными: A, B, C,...
/*Пример 5.2.*/ Predicates Pr Goal Pr. Clauses Pr:- Nl,nl, A= «191186,», B= «Санкт-Петербург,», С= «ул. Миллионная, 5,», D= «СЗПИ», Concat (A,B,E), Concat (C,D,F), Concat (E,F,G), Write (G).
Встроенный предикат frontchar(Str1, Char, Str2) (i,o,o),(i,i,o),(i,o,i),(i,i,i),(o,i,i) аналогичен предикату concat. Отличие заключается в том, что frontchar присоединяет значение переменной Char (а она имеет тип char) только К НАЧАЛУ СТРОКИ. При этом возможно три варианта использования предиката frontchar, а условно эти варианты можно представить так: Str1 = Char + Str2, Char = Str1 - Str2, Str2 = Str1 - Char. Объединяя работу этого предиката с рекурсивной обработкой списка можно реализовать расщепление строки в последовательность символов, или, наоборот, для создания строки из последовательности символов, или, наконец, для проверки символов в строке.
Пример 5.3 демонстрирует преобразование строки в список символов с использованием предиката frontchar.
/*Пример 5.3.*/ Domains charlist = char* str = string Predicates Str_list (str, charlist) Clauses str_list («», []). str_list (S, [H|T]):- Frontchar (S, H, S1), Str_list (S1,T).
В правиле str_list первым параметром является строка, а вторым - список. Предикат frontchar рекурсивно извлекает первый символ из S и помещает его в список. В разделе domains объект charlist является списком символов, а str -строкой.
При вводе цели str_list(«СЗПИ», A) переменная A связывается со списком [’С’,’З’,’П’,’И’].
СОЗДАНИЕ ПОДСТРОК Подстрока - это строка, являющаяся копией некоторой части исходной строки. Для создания подстрок используется встроенный предикат frontstr (N, Str1, StartStr, EndStr) (i,i,o,o). Аргументу StartStr присваивается подстрока из N первых символов исходной строки Str1, а EndStr присваивается остаток строки Str1. Например, утверждение frontstr(13, «Искусственный интеллект», StartStr, EndStr). Присваивает StartStr значение «Искусственный», а EndStr - «интеллект», т.к. N = 13 соответствует числу символов слова «Искусственный».
Кроме рассмотренных в этом параграфе встроенных предикатов, широко используемых для преобразования строк, можно перечислить еще целый ряд предикатов: subchar (String, Position, Char) (i,i,o) - переменной Char присваивается элемент строки String в позиции Position. substring (String, Position, Length, Substring) (i,i,i,o) - переменной Substring присваивается часть строки String, начинающейся с позиции Position и имеющей длину Length. searchchar (String, Char, Position) (i,i,o) - переменной Position присваивается номер позиции в строке String, в которой впервые встречается символ Char. searchstring (String, Substring, Position) (i,i,o) - переменной Position присваивается номер позиции в строке String, с которой начинается подстрока Substring.
ОПЕРАЦИИ ПРЕОБРАЗОВАНИЯ ТИПОВ Для преобразования данных из одного типа в другой используются следующие предикаты char_int, str_char, str_int, str_real, upper_lower. Их применение целесообразно при выполнении преобразований между символом и его значением в коде ASCII, между строкой и символом, строкой и целым, строкой и вещественным, символами верхнего и нижнего регистра.
Все предикаты преобразования типов содержат два объекта, а имена предикатов показывают тип выполняемого преобразования: Char_int (Char, Integer), (i,o),(o,i),(i,i), Str_char (String, Char), (i,o),(o,i),(i,i), Str_int (String, Integer), (i,o),(o,i),(i,i), Str_real (String, Real), (i,o),(o,i),(i,i),
|