Создание символьных префиксов




Создать "префиксный" символ — это значит присоединить этот символ к началу строки. Например, присоединение префикса 'А' к "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

Работа с файлами



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: