Краткие теоретические сведения. fronttoken(String, Token, RestString)
Под строкой в Прологе понимается последовательность символов, заключенная в двойные кавычки. Prolog поддерживает различные стандартные предикаты для обработки строк. Стандартные предикаты обработки строк делятся на две группы: базовое управление строками и преобразование строковых типов. Основными предикатами для работы со строками можно назвать предикат frontchar (String, Char, StringRest), позволяющий разделить строку String на первый символ Char и остаток строки StringRest и предикат fronttoken (String, Lexeme, StringRest), который работает аналогично предикату frontchar, но только отделяет от строки String лексему Lexeme. fronttoken(String, Token, RestString) (string,string,string) −(i,o,o) (i,i,o)(i,o,i) (i,i,i) (o,i,i) Разделяет строку, заданную параметром String, на лексему Token и остаток RestString согласно поточному шаблону. Лексемой называется последовательность символов, удовлетворяющая следующим условиям: имя в соответствии с синтаксисом Prolog’а, число или отличный от пробела символ. (i, i, o) fronttoken ("Go to cursor”, X, Y) X=”Go” Y=”to cursor” Предикаты обработки строк используются для разделения строк либо на список отдельных символов, либо на список заданных групп символов. Пример 1. Теперь попробуем применить рассмотренные предикаты. Создадим предикат, который будет преобразовывать строку в список символов. Предикат будет иметь два аргумента. Первым аргументом будет данная строка, вторым − список, состоящий из символов исходной строки. Решение, будет рекурсивным. Базис: пустой строке будет соответствовать пустой список. Шаг: с помощью встроенного предиката frontchar разобьем строку на первый символ и остаток строки, остаток строки перепишем в список, после чего добавим первый символ исходной строки в этот список в качестве первого элемента. Запишем эту идею:
str_list("",[]). /* пустой строке соответствует пустой список */ str_list(S,[H|T]): – frontchar(S,H,S1), str_list(S1,T). /* H − первый символ строки S, S1 − остаток строки */ /* T − список, состоящий из символов, входящих в строку S1*/ Пример 2. Разработаем предикат, который будет преобразовывать список символов в строку. Предикат будет иметь два аргумента. Первым аргументом будет список символов, вторым − строка, образованная из элементов списка. Базис рекурсии: пустому списку соответствует пустая строка. Шаг: если исходный список не пуст, то нужно перевести в строку его хвост, после чего, используя стандартный предикат frontchar, приписывать к первому элементу списка строку, полученную из хвоста исходного списка. Запишем эту идею: list_str([],""). /* пустой строке соответствует пустой список */ /* S1 − строка, образованная элементами списка T */ /* S − строка, полученная дописыванием строки S1 к первому элементу списка H */ Встроенный предикат str_len, предназначен для определения длины строки, т.е. количества символов, входящих в строку. Он имеет два аргумента: первый − строка, второй − количество символов. str_len(String, Length) (string, integer) − (i,i) (i,o) (o,i) (i, o) – с параметром длина связывается количество символов в строке (i,i) – выполняется успешно, если строка имеет указанную длину. Следующий стандартный предикат concat предназначен, вообще говоря, для соединения двух строк, или, как еще говорят, для их конкатенации. У него три аргумента, каждый строкового типа, по крайней мере, два из трех аргументов должны быть связаны. concat (Стр1, Стр2, Стр3) (string, string, string): (i, i, o) (o, i, i) (i, o, i) (i, i, i) (i, i, o) concat ("фут”, "бол”, X) X=”футбол” (o, i, i) concat (X, "ball”, "football”) X= "foot” (i, i, i) concat ("foot”, "ball”, "football”) True Frontstr(Lenght, Inpstring, StartString, RestString) (integer, string, string, string) − (i, i, o, o) Разделяет строку Inpstring на две части. StartString будет иметь длину Lenght первых символов исходной строки, RestString представляет собой остаток строки InpString.
Isname(StringParam) (string) - (i) Завершается успешно, если StringParam есть имя, удовлетворяющее синтаксису Турбо-Пролога. Стандартные предикаты преобразования типа служат для преобразования символов с десятичным кодом ASCII, строк с отдельным символом, строк с целыми и действительными числами, а также строчных букв латинского алфавита с соответствующими прописными буквами. Предикаты, предназначенные для преобразования типа: Char_int(CharParam,IntgParam) (char,integer) − (i,o) (o,i) (i,i) Преобразует символ в код ASCII, согласно поточному шаблону. Str_int(StringParam, IntgParam) (string,integer) − (i,o) (o,i) (i,i) Строка, представляющая целое десятичное число, преобразуется в это число. Str_char(StringParam, CharParam) (string,char) − (i,o) (o,i) (i,i) Один знак как строка преобразуетс в символ. Str_real(StringParam, RealParam) (string,real) − (i,o) (o,i) (i,i) Строка, представляющая десятичное число, преобразуется в это число. Upper_lower(StringInUpperCase, StringInLowerCase) (string,string) - (i,i) (i,o) (o,i) Строка, записанная прописными буквами, записывается в строку со строчными буквами. Upper_lower(CharInUpperCase, CharInLowerCase) (char,char) − (i,i) (i,o) (o,i) Прописной символ преобразовывается в строчный. Каждый предикат преобразования типов имеет три варианта потока параметров; в случаях (i,o) и (o,i) выполняется соответствующие преобразования, а в случае (i,i) осуществляется проверка, которая завершается успешно, только если два аргумента являются различными представлениями одного и того же объекта. Варианты заданий Вариант 1. Создайте предикат, который будет находить последнюю позицию вхождения символа в строку. Вариант 2. Создайте предикат, который подсчитает общее количество латинских букв в списке символов. Вариант 3. Создайте предикат, который будет подсчитывать количество русских гласных букв в строке. Вариант 4. Создайте предикат, находящий в исходной строке слово, в котором наибольшее количество русских гласных букв. Вариант 5. Создайте предикат, который будет удалять из данной строки все вхождения заданного символа. Вариант 6. Создайте предикат, удаляющий из данной строки все повторные вхождения символов. Вариант 7. Создайте предикат, который продублирует вхождение каждого символа в строку.
Вариант 8. Создайте предикат, "переворачивающий" строку (меняющий в строке порядок символов на обратный). Вариант 9. Создайте предикат, проверяющий, является ли данная строка палиндромом. Вариант 10. Создайте предикат, составляющий список символов, которые входят одновременно в обе данных строки. Вариант 11. Создайте предикат, находящий в исходной строке слово максимальной (минимальной) длины. Вариант 12. Создайте предикат, преобразующий строку в список слов, состоящих из четного количества символов. Вариант 13. Создайте предикат, преобразующий строку в список слов, которые упорядочены по длине. Вариант 14. Создайте предикат, преобразующий строку в список слов, которые упорядочены в лексикографическом порядке. Вариант 15. Создайте предикат, преобразующий исходную строку в строку, состоящую из первых букв слов первоначальной строки. Вариант 16. Создайте предикат, преобразующий исходную строку в строку, состоящую из последних букв слов первоначальной строки. Вариант 17. Создайте предикат, проверяющий правильность расстановки скобок в исходной строке. Вариант 18. Создайте предикат, меняющий местами первую и последнюю буквы в каждом слове исходной строки. Вариант 19. Дана строка символов. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *. Вариант 20. Дана строка символов, в которой есть двоеточие. Получить все символы, расположенные до первого двоеточия включительно. Вариант 21. Дана строка символов. Выяснить, верно ли, что в строке имеются пять идущих подряд букв е. Вариант 22. Дана строка символов. Определить число вхождений в строку группы букв abc. Вариант 23. Дана строка символов. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Найти количество слов, у которых первая и последняя буквы совпадают. Вариант 24. Дана строка символов. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Найти длину самого длинного слова.
Вариант 25. Дана строка символов. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Подсчитать количество букв «а» в последнем слове. Отчет по лабораторной работе должен содержать: титульный лист с указанием номера варианта; текст задания; исходные тексты программы с комментариями.
Контрольные вопросы: 1 Как в Прологе описываются строки. 2 Какие стандартные предикаты используются для работы со строками в Прологе? 3 Для каких целей используется стандартный предикат frontchar? Приведите примеры его использования. 4 Назовите стандартные предикаты для базового управления строками. 5 Какие стандартные предикаты используются для преобразования строковых типов. Лабораторная работа № 6
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|