- •Лабораторная работа № 4 Работа со списками
- •3.1 Длина строки
- •3.2 Конкатенация строк
- •3.3. Создание подстрок
- •3.4. Преобразование данных
- •3.5. Преобразования, определяемые пользователем
- •3.6 Создание символьных префиксов
- •3.7. Преобразование строк
- •3.8. Формирование атомов из строк
- •Лабораторная работа № 5 Работа с файлами
- •4.1.Предикаты для работы с файлами
- •Описание файлового домена
- •Запись в файл
- •Чтение из файла
- •Модификация существующего файла
- •Дозапись в конец уже существующего файла
- •Лабораторная работа № 6 Структуры
- •Абстракция данных
3.6 Создание символьных префиксов
Создать "префиксный" символ — это значит присоединить этот символ к началу строки. Например, присоединение префикса 'А' к "BCDEF" дает строку "ABCDEF". Эта операция в Турбо-Прологе реализуется с помощью встроенного предиката frontchar:
frontchar(String,Char,Rest_of_string}.
Объекту String присваивается значение, состоящее из Char и Rest_of_string (остаток строки).
Рассмотрим в качестве примера три предиката. Первый из них
frontchar(Str, 'F', "OX"),
присваивает символьной переменной Str значение "FOX" (лиса). Второй
frontchar("SPRING", С, "PRING").
присваивает символьной переменной С значение 'S'. Третий
frontchar("dBASE", 'd', X).
присваивает X значение BASE.
Предикат frontchar аналогичен предикату concat, за исключением того, что он присоединяет значение типа char к началу строки. Как и предикаты, выполняющие преобразование типов, предикат frontchar имеет несколько направлений обработки данных.
Программа Frontchar (рис. 16) демонстрирует использование предиката frontchar.
/* Программа: Frontchar */
/* Назначение: Демонстрация использования предиката */
/* frontchar(строка,первый_символ.строка) */
predicates
print_all
goal
print_all.
clauses
print_all :-
frontchar(Strl,'A',"BCDEF"),
nl,write(" Strl - ", Strl),
frontchar(Str2,'8',"is enough"),
nl.write(" Str2 = ", Str2),
frontchar(Str3,'?'."Show"),
nl,write(" Str3 = ", Str3),
frontchar(" Str4,' #', "&%#!!!"),
nl,write(" Str4 = ", Str4),
frontchar(Str5,1,"23LOTUS"),
nl,write(" Str5 = ". Str5),
frontchar(Str6,' ',"//"),
nl,write(" Str6 = ", Str6).
Рис. 16. Программа Frontchar
3.7. Преобразование строк
Предикат frontchar полезен при преобразовании строки в список символов. Пусть, например, необходимо преобразовать строку STARS в список ['S','T','A','R','S']. Метод этого преобразования заключается в циклическом использовании предиката frontchar для "вырезания" первого символа и размещения его в списке. Правило, которое выполняет эту процедуру, следующее:
convert("", []).
convert(Str, [Head|Tall]) :-
frontchar(Str, Head, Strl),
convert(Strl, Tall).
Рис. 17. Результат работы программы Frontchar
В правиле convert первым параметром является строка, а вторым параметром — список. Предикат frontchar рекурсивно извлекает первый символ из Str и помещает его в список.
Программа Charlistl (рис. 18) использует данное правило. Как вы видите, в разделе domains программы объект char_list является списком символов, a str — строкой.
Диалог с программой во время ее выполнения показан на рис.19. Заметьте, что второй список — это список цифр, которые образуют строку. Они не имеют числового смысла, т. е. арифметические операции над ними не могут быть выполнены.
/* Программа: Charlistl */
/* Назначение: Демонстрация преобразования строки */
/* в список символов с использованием */
/* предиката frontchar */
domains
char_list = char *
str = string
predicates
convert(str, char_list)
clauses
convert("",[]).
convert(Str, [Head|Tail]) :-
frontchar(Str,Head,Strl),
conver(Strl,Ta1l).
Рис. 18. Программа Charlist1
Программа Charlist2 (рис. 20) является вариантом программы Charlistl. Она имеет внутреннюю цель, состоящую из правила do_convert_print. Это правило использует правило convert для преобразования строки "STARS AND STRIPES" в список символов. Charlist2 выводит на печать строки чисел в удобном формате (рис. 21).
Рис. 19. Диалог с программой Charlist1
/* Программа: Charlist2 */
/* Назначение: Демонстрация преобразования строки */
/* в список символов с использованием */
/* предиката frontchar */
domains
char_list = char *
str = string
predicates
convert(str, char_1ist)
print list(char_list)
do_convert_and_print
goal
do_convert_and_print.
clauses
convert("",[]).
convert(Str, [Head|Tail]) :-
frontchar(Str,Head,Strl),
convert(Strl,Tail).
print list([]).
print_1ist([Head|Tail]) :-
write(Head," "),
print_list(Tail).
do_convert_and_print :-
n1,nl,
write("STARS AND STRIPES"),nl,nl,
convert("STARS AND STRIPES",List),
print_list(List), nl,nl,
write(" All done!"),n1.
Рис. 20. Программа Charlist2
Рис. 21. Результат работы программы Charlist2
