Создать "префиксный" символ — это значит присоединить этот символ к началу строки. Например, присоединение префикса 'А' к "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
Преобразование строк
Предикат 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)
printlist(char_list)
do _ convert _ and _ print
goal
do _ convert _ and _ print.
clauses
convert("",[]).
convert(Str, [Head|Tail]):-
frontchar(Str,Head,Strl),
convert(Strl,Tail).
printlist([]).
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
3.8. Формирование атомов из строк
Атом (token) — это последовательность символов, которая является особым видом строки Турбо-Пролога. Атом может быть числом. Если число имеет предшествующий знак (+ или -), то этот знак также рассматривается как отдельный атом. Атом может быть любым символом, кроме пробела. Переменные используются для передачи параметров. Переменные являются атомами, но не все атомы есть переменные.
В Турбо-Прологе предусмотрен встроенный предикат, обеспечивающий формирование атома из строки. Это предикат fronttoken. Его синтаксис следующий:
fronttoken(String, Token, Rest _ of _ string).
Либо String должна быть означена, либо оба Token и Rest _ of _ string должны быть означены.
Если первый символ строки есть символ из групп с 1 по 4 в табл. 2, то этот символ присваивается переменной Token, а оставшиеся символы присваиваются Rest_of_string. Либо если строка имеет значение, то Token получает это значение, a Rest_of_string получает значение пустой строки ("").
Ниже приводится несколько примеров отношения, определяемого этим предикатом:
1. Предикат fronttoken(Str,"Default","Directory") присваивает Str значение "Default directory".
2. Предикат fronttoken(Str,"$default","$directory") присваивает Str значение "$default$directory".
3. Предикат fronttoken("Pointer",Token,Rest) присваивает Token значение "Pointer", а переменной Rest присваивает значение ""(пустая строка).
4. Предикат fronttoken("$Command",Token,Trail) присваивает Token значение "$", а переменной Trail значение "Command".
5. Предикат fronttoken("$$command",Token,Trail) присваивает Token значение "$", а переменной Trail значение "$command".
6. Предикат fronttoken("!default",Token,Rest) присваивает переменной Token значение "!", а переменной Rest значение "default".
7. Предикат fronttoken("$RUN ALBAS",Token.Rest) присваивает переменной Token значение "$", а переменной Rest значение "RUN AI.BUS".
Программа Token 1 (рис. 22) иллюстрирует приведенные примеры.
Предикат fronttoken может быть использован в правиле преобразования строки в список атомов. Это правило аналогично правилу, которое использовалось для преобразования строки в список символов:
convers(Str, [Head|Tail]):-
fronttoken(Str,Head,Strl),!,
convers(Strl,Tail).
convers(_, []).
![]() |
/* Программа: Tokenl */
/* Назначение: Демонстрация использования встроенного */
/* предиката */
/* fronttoken (строка, атом,остаток_строки) */
predicates
print _ al1
goal
print _ all.
clauses
print _ all:-
fronttoken(Strl, "Default","Directory"),
nl,write(" Strl = ",Strl),
fronttoken(Str2, "$defau1t","Sdirectory"),
nl,write(" Str2 = ",Str2),
fronttoken("Pointer",Tokenl,Restl),
nl,write(" Tokenl = ",Tokenl),
nl,write(" Restl = ",Restl),
fronttoken("$Command", Token2,Trai11),
nl,write(" Token2 = ",Token2),
nl,write(" Traill = ",Traill),
fronttoken("$$command", Token3,Trai13), nl,
write(" Token3 = ",Token3),
nl,write(" ТrаilЗ = ",Trail3),
fronttoken(Str3, "!default","$default"),
nl,write(" Str3 = ",Str3),
fronttoken("$RUN AI.BAS",Token4,Rest2),
nl,write(" Token4 = ",Token4),
nl,write(" Rest2 = ",Rest2).
/***** конец программы *****/
Рис. 22. Программа Token1
Рис. 23. Результат работы программы Token1
Вариант предиката convers (_,[]) будет успешен, если список будет пустым, и это условие определяет точку, с которой должно быть начато преобразование. Например, строка "one two three" должна быть преобразована в список атомов:
[one, two, three].
Программа Token2 (рис. 109) демонстрирует преобразование строк в список атомов. Результат программы показан на рис. 110. Заметьте, что строка "STARS AND STRIPES" преобразуется в список символов:
["STARS", "AND", "STRIPES"].
Пробелы устранены.
/* Программа: Token2 */
/* Назначение: Демонстрация преобразования строки в */
/* список строк при помощи предиката */
/*' fronttoken (строка,атом,остаток, строки) */
domains
str _ list = symbol *
str = string
predicates
convers(str,str_list)
clauses
convers(Str,[Head|Tai1]):-
fronttoken(Str,Head,Strl),!,
convers(Srtl,Таi1).
convers(_,[]).
Рис. 24.Программа Token2
Рис. 25. Диалог с программой Token2
Программа Token3 (рис. 26) является вариантом Token2. Эта программа использует внутреннюю цель, которая является правилом do _ convert _ and _ print. Эта цель состоит из двух подцелей. Подцель convers преобразует строку "STARS AND STRIPES FOREVER" в список атомов, а подцель print _ list печатает получившийся список. Результат работы программы показан на рис.27.
![]() |
/* Программа: Token3 */
/* Назначение: Демонстрация преобразования строки в */
/* список строк при помощи предиката */
/* fronttoken (строка,атом,остаток_строки)*/
domains
str _ 1ist = symbol *
str = string
predicates
convers(str,str _ 1ist)
print _ list(str _ list)
do _ convert _ and _ print
goal
do _ convert _ and _ print.
clauses
convers(Str,[Head|Tail]):-
fronttoken(Str,Head,Strl),!,
convers(Strl,Tail).
convers(_,[]).
print_1ist([]).
print _ list([Head|Tail]):-
write(" ",Head),nl,
print _ list(Tail).
do _ convert _ and _ print:-
nl,nl,
write("STARS AND STRIPES FOREVER"),
nl,nl,
convers("STARS AND STRIPES FOREVER",List),
print _ list(L1st).
nl,nl,
write(" All done!"),nl.
![]() |
Рис. 26. Программа Token3
Рис. 27. Результат работы программы Token3
Задание. Разработать программу для работы со строковыми переменными, согласно варианта (таблица 4).
Таблица 4
Вариант | Задание |
Разработать процедуру для преобразования строки символов список с использованием предиката frontchar | |
Разработать процедуру для преобразования строки символов список с использованием предиката fronttoken | |
Разработать процедуру разбиения строки пополам | |
Разработать процедуру разбиения строки на 3 части | |
Разработать процедуру разбиения строки на 4 части | |
Разработать процедуру циклического ввода символа и его прибавления к началу строки | |
Создать процедуру для ввода строки и ее разделения пополам, если эта строка специальная | |
Разработать процедуру для преобразования строки чисел список с использованием предиката frontchar | |
Разработать процедуру для преобразования строки чисел список с использованием предиката fronttoken | |
Разработать структуру для преобразования строки в целочисленный тип, возведения в квадрат и перевода в вещественный тип | |
Разработать процедуру циклического ввода строки символа и его прибавления к началу строки | |
Разработать процедуру циклического ввода атома и его прибавления к началу строки | |
Разработать процедуру разбиения строки на 4 части | |
Разработать структуру для преобразования строки в вещественный тип, возведения в квадрат и перевода в тип целочисленный | |
Разработать процедуру циклического ввода строки символов и ее прибавления к началу строки |
Лабораторная работа № 5
Работа с файлами