Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб 4 - 6(задания).doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
313.34 Кб
Скачать

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

Вариант

Задание

1

Разработать процедуру для преобразования строки символов список с использованием предиката frontchar

2

Разработать процедуру для преобразования строки символов список с использованием предиката fronttoken

3

Разработать процедуру разбиения строки пополам

4

Разработать процедуру разбиения строки на 3 части

5

Разработать процедуру разбиения строки на 4 части

6

Разработать процедуру циклического ввода символа и его прибавления к началу строки

7

Создать процедуру для ввода строки и ее разделения пополам, если эта строка специальная

8

Разработать процедуру для преобразования строки чисел список с использованием предиката frontchar

9

Разработать процедуру для преобразования строки чисел список с использованием предиката fronttoken

10

Разработать структуру для преобразования строки в целочисленный тип, возведения в квадрат и перевода в вещественный тип

11

Разработать процедуру циклического ввода строки символа и его прибавления к началу строки

12

Разработать процедуру циклического ввода атома и его прибавления к началу строки

13

Разработать процедуру разбиения строки на 4 части

14

Разработать структуру для преобразования строки в вещественный тип, возведения в квадрат и перевода в тип целочисленный

15

Разработать процедуру циклического ввода строки символов и ее прибавления к началу строки