Главная

ПРОЕКТ "ЧЕЛОВЕК. ЗЕМЛЯ. ВСЕЛЕННАЯ"

Инструменты пользователя

Инструменты сайта


project:prolog:stroki

Строки. Использование строк

Использование строк

Строка - это набор символов (слова и предложения). Термин «символ» включает буквы русского (английского) алфавита, цифры, такие символы как +, @ и $, а так же управляющие символы, соответствующие некоторым клавишам, таким как Enter и Esc.

Фактически строки это наиболее распространенные объекты, связанные с программированием.

Основные операции, выполняемые над строками:

  • объединение строк для образования новой строки;
  • расщепление строки для создания двух новых строк, каждая из которых содержит некоторые из исходных символов;
  • поиск символа или подстроки внутри данной строки.

Пролог имеет несколько встроенных предикатов, используемых при построении правил, манипулирующих строками.

Множество символов Пролога

В компьютере символы представлены числами. Большая часть персональных компьютеров, включая все IBM PC и совместимые с ними машины, используют одну и туже систему числовых кодов, называемую Американским стандартным кодом для обмена информацией (ASCII). Символы A, B и C, например, представлены числами 65, 66 и 67. Прописные буквы представлены числами, начинающимися с 32 и далее.

Множество кодов ASCII включает следующие подгруппы:

  • символы английского (и русского) алфавита (как строчные, так и прописные);
  • цифры от 0 до 9;
  • специальные символы, такие как +, -, $, * и символы пунктуации;
  • управляющие символы, такие как Ctrl-C и Ctrl-Q.

Использование кодов ASCII для «записи» символов

При программировании на Прологе символы могут быть «записаны» при помощи их кодов ASCII. Обратный слэш (\), непосредственно за которым следует десятичный код ASCII (N) символа, интерпретируется как символ. Для представления одиночного символа выражение \N должно быть заключено в одиночные кавычки ('\N').

Для представления строки символов их коды ASCII помещаются друг за другом, и вся строка заключается в двойные кавычки («\N\N\N»).

В качестве примера рассмотрим символы A, B и C, десятичные коды которых есть 65, 66 и 67. В Прологе символ A с использованием его ASCII кода записывается как '\65'. Представление в ASCII коде строки ABC есть «\65\66\67».

Десятичная цифра 4 представляется в коде ASCII как '\52'. Десятичное число 436.375 записывается строкой Пролога в коде ASCII как «\52\51\54\46\51\55\53\».

В общем случае обратный слэш (\), непосредственно за которым следует код символа в ASCII, интерпретируется как этот символ. Некоторые символы являются управляющими и предназначены для управления процессом вывода на экран. Символ '\10' есть символ окончания строки (line feed).

Пример

  • ASCIIprint - демонстрация использования кодов ASCII для печати одиночных символов и строки символов.

Присваивание переменным строковых значений

Строка символов может быть присвоена переменной. Следующие присваивания эквивалентны:

S = «\84\117\114\98\111\32\80\82\79\76\79\71\» S = «Turbo PROLOG».

Представление символьных строк в коде ASCII весьма громоздко и неудобно. Обычно более эффективно непосредственное алфавитно-цифровое представление. Однако представление символов и строк в коде ASCII используется в машинно-ориентированных языках, таких как ассемблеры, а также при создании компиляторов, операционных систем и контроллеров устройств связи. Внутри программ на Прологе вам могут встретиться модули, в которых применяются обозначения в коде ASCII.

Пример

  • TeamPrint1 - демонстрация операции присваивания строк (вызов и обработка в одном и том же правиле).
  • TeamPrint2 - демонстрация операции присваивания строк (вызов и обработка в разных правилах).

Длина строки

Длина строки измеряется полным числом символов в строке.

Пролог имеет встроенный предикат str_len, который используется для нахождения длины строки.

Синтаксис:

srt_len(String_value, String_length).

Если переменная L не означена до начала обработки правила srt_len(«Строка»,L), то она получит значение длины строки «Строка». Этим значением будет целое число - 6.

Если же до начала выполнения вызова предиката str_len обе его переменные уже означены, то предикат будет успешным, только при условии, что значение String_length равно длине строки String_value.

Например, если S имеет значение ABC, а L имеет значение 3, то предикат str_len(S,L) успешен. В противном случае он неуспешен.

Пример

  • ShowLength1 - демонстрация нахождения длины строки.
  • ShowLength2 - демонстрация нахождения длин строк, находящихся в базе данных.

Конкатенация строк

Конкатенация строк - это объединение этих сторок, то есть образование одной новой строки. Например, результат конкатенации двух строк: «красивая » и « женщина» может быть либо «красивая женщина » или «женщина красивая».

Эти две результирующие строки различны, так как образующие их строки были объединены в различном порядке.

Пролог имеет встроенный предикат concat, который выполняет соединение (конкатенацию) двух строк.

Синтаксис:

concat(Input_string1, Input_string2, Output_String).

Объекты Input_string1 и Input_string2 - две входные строки. Объект Output_string - объединенная выходная строка.

Пример

  • Concat1 - демонстрация объединения строк.
  • Concat2 - демонстрация объединения строк. Входные и выходные строки представлены переменными с односимвольными именами.

Выделение подстрок

Подстрока - это строка, являющаяся копией некоторой части исходной строки. Например, двумя возможными подстроками строки «Москва - столица РФ» являются «Москва - » и «столица РФ». Пролог имеет встроенный предикат frontstr, служащий для выделения подстрок.

Синтаксис:

frontstr(Number, Source_string, Substring1, Substring2).

Аргумент Number задает полное число символов, которые должны быть скопированы в Substring1 из Source_String, являющейся исходной строкой. Остальные символы строки Source_string будут скопированы в Substring2.

Например, утверждение frontstr(9,«Москва - столица РФ», String1, String2). присваивает String1 значение «Москва - », а String2 значение «столица РФ».

Пример

  • Substring - демонстрация выделения подстроки.

Преобразование данных

Турбо-Пролог для преобразования данных из одного типа в другой имеет следующие предикаты: upper_lower str_char str_int str_real char_int.

Их применение целесообразно в случае, когда тип объектов встроенного предиката отличается от типа объектов предиката, определенного пользователем. Например, предикат writef может вызвать разрушение системы, если ему будет передан объект типа char. Если символьная переменная Drive_ltr_str означена символом 'a', то предикат writef(«The current drive is %:», Drive_ltr_str) вызовет отказ системы.(Во время компиляции сообщения об ошибках и предупреждения не выдаются). Данная проблема легко может быть преодолена с помощью предикатов, указанных выше. Например: str_char(Drive_ltr_srt, Drive_ltr), writef(«The current drive is %:», Drive_letter).

Преобразования столь же необходимы, когда значение одного типа должно быть присвоено переменной другого типа. Все предикаты преобразования данных содержат два объекта. Вы вероятно заметили, что имена предикатов показывают тип выполняемого преобразования. Например, str_char преобразует строку, состоящую из одного символа и имеющую тип string, в значение типа char. Имена предикатов также указывают и порядок объектов. Например, объект типа string является первым объектом в str_char, а объект типа char - вторым. Эти предикаты имеют два направления преобразования данных. Например, если переменная S1 уже означена и имеет значение STARS AND STRIPES, то предикат upper_low(S1,S2) присваивает строку stars and stripes переменной S2. Но, если S2 означена, а S1 не означена, то значение STARS AND STRIPES получает переменная S1. В случае же, когда обе переменные означены, предикат успешен, если одна из переменных имеет значение строки, содержащееся в другой переменной, но записанной строчными буквами. Предикат str_char используется для преобразования объектов типа string в объекты типа char. Предикат str_int используется для преобразования строчного представления целых чисел в переменные типа integer. Предикат str_real используется для преобразования действительных чисел в строки. Предикат char_int используется для присвавиания числа (кода ASCII символа) данному объекту. Программа Coversions1 (листинг 6.9) содержит примеры преобразования данных с использованием встроенных предикатов Турбо-Пролога. Результат работы программы показан на рис.6.7. Листинг 6.9. Рисунок 6.7.

Упражнение

6.6. Напишите программу для выполнения следующих преобразований. Используйте внутренную цель.

1. upper_lower(«PREDICATE LOGIC», L). 2. upper_lower(V, «expert systems»). 3. upper_lower(«LOTUS123», S). 4. upper_lower(«Oral_Cavity», Q). 5. str_char(«A», C8). 6. str_char(«Z», C9). 7. char_int(‘Q’, N6). 8. char_int(‘#’, N9). 6.8. Преобразования, определяемые пользователем

Преобразования действительных чисел в целые или целых в действительные весьма удобны при выполнении математических вычислений. Преобразования строк в символы удобны при подготовке обработки данных и их записи во внешнюю память. В этом разделе будет показано как строить правила для выполнения этих преобразований. Рассмотрим преобразование действительного числа в целое. В этом примере целое значение, соответствующее действительному числу 5432.765, есть 5432. Правило преобразования построено при помощи символа равенства (=): conv_real_int(R,N) :- R=N. Здесь R это переменная для действительных чисел, а N - переменная для целых чисел. Объявление в разделе predicates следующее: conv_real_int(r,n). Правило пытается вычислить значение R. Если текущее значение R действительное число, то правило успешно; в противном случае правило завершается неуспешно. При успешном завершении правила целая часть действительного числа присваивается целочисленной переменной N. В Турбо-Прологе целые числа ограничены диапазоном от -32768 до 32767, поэтому рассматриваемое правило преобразования не будет работать, если значение действительного числа меньше, чем -32768.0 или больше, чем 32767.0. Правило для преобразования целого числа в действительное следующее: conv_int_real(N,R) :- N=R. Здесь N это целочисленная переменная , а R - переменная для действительных чисел. Если N имеет значение 1234, то R получит значение 1234 (десятичная точка подразумевается, но не пишется). Правило пытается вычислить значение N. Если текущее значение N есть целое число, то правило успешно; в противном случае правило неуспешно. При успешном завершении правило выбирает целое число и присваивает его переменной R. И в этом случае правило преобразования работает только при условии, что целое число находится внутри допустимого диапазона. Преобразование строки в символ также может быть выполнено при помощи простого правила: conv_str_symb(S,Sb) :- S=Sb. Например, если S=«Turbo PROLOG», то Sb=Turbo PROLOG. Объект S объявлен как объект типа string, а Sb объявлен как объект типа symbol. Программа Conversion2 (листинг 6.10) использует все рассмотренные правила. Результат ее работы показан на рис. 6.8. Листинг 6.10 Рисунок 6.8. Упражнение

6.7. Напишите результат обработки следующих входных данных, используя правила, определенные в программе Conversiоn2: 1. Входное действительное число: 1697.432284 Выходное целое число:_ 2. Входное целое число: 3333 Выходное действительное число: 3. Входная строка: «Turbo_Prolog_Compiler» Выходной символ: 6.9. Создание символьных префиксов Создать «префиксный» символ - это значит присоединить этот символ к началу строки. Например, присоединение префикса 'A' к «BCDEF» дает строку «ABCDEF». Эта операция в Турбо-Прологе реализуется с помощью встроенного предиката frontchar: frontchar(String,Char,Rest_of_string). Объекту String присваивается значение, состоящее из Char и Rest_of_string (остаток строки). Рассмотрим в качестве примера три предиката. Первый из них frontchar(Str, 'F', «OX»). присваивает символьной переменной Str значение «FOX» (лиса). Второй frontchar(«SPRING», C, «PRING»). присваивает символьной переменной C значение 'S'. Третий frontchar(«dBASE», ‘d’, X). присваивает X значение BASE. Предикат frontchar аналогичен предикату concat, за исключением того, что он присоединяет значение типа char к началу строки. Как и предикаты, выполняющие преобразование типов, предикат frontchar имеет несколько направлений обработки данных. Программа Frontchar (листинг 6.11) демонстрирует использование предиката frontchar. Результат работы программы показан на рис.6.9. Упражнение 6.8. Напишите программу на Турбо-Прологе, которая циклически присоединяет символы к началу строки «POEM.TXT». В результате должна получиться строка «type POEM.TXT». Листинг 6.11. Рисунок 6.9. 6.10.Преобразование строк в список символов Предикат frontchar полезен при преобразовании строки в список символов. Пусть, например, необходимо преобразовать строку STARS в список ['S','T','A','R','S']. Метод этого преобразования, заключается в циклическом использовании предиката frontchar для «вырезания» первого символа и размещения его в списке. Правило, которое выполняет эту процедуру, следующее: convert(««, []). convert(Str, [Head|Tail]) : frontchar(Str, Head, Str1), convert(Str1, Tail). В правиле convert первым параметром является строка, а вторым параметром - список. Предикат frontchar рекурсивно извлекает первый символ из Str и помещает его в список. Программа Charlist1 (листинг 6.12) использует данное правило. Как вы видите, в разделе domains программы объект char_list является списком символов, а str - строкой. Диалог с программой во время ее выполнения показан на рис.6.10. Заметьте, что второй список - это список цифр, которые образуют строку. Они не имеют числового смысла, т.е. арифметические операции над ними не могут быть выполнены. Листинг 6.12. Рисунок 6.10. Программа Charlist2 (листинг 6.13) является вариантом программы Charlist1. Она имеет внутреннюю цель, состоящую из правила do_convert_print. Это правило использует правило convert для преобразования строки «STARS AND STRIPES» в список символов. (Вспомните правило print_list из гл. 5). Charlist2 выводит на печать строки чисел в удобном формате (см. рис.6.11). Листинг 6.13. Рисунок 6.11. Упражнения 6.9. Запустите программу Charlist1 и введите следующие цели: 1. convert(«National Football League» ,B). 2. convert(«Material Girl», G). 3. convert(«phenylpropanolamine hydrochloride», M). Проанализируйте результат для каждого случая. 6.10. Модифицируйте программу Charlist2 так, чтобы каждый элемент списка печатался на своей строке. 6.11.Специальные строки Турбо-Пролога На протяжении данной главы строки рассматривались только как цепочки символов. Однако в Турбо-Прологе определены специальные строки, используемые для определенных целей. Эти строки называются именами. Имена используются для обозначения символических констант, доменов, предикатов и переменных. По определению специальные строки Турбо-Пролога имеют следующие пять свойств: 1. Строка строится из прописных и строчных букв, цифр и символов подчеркивания. 2. Между символами не должно быть пробелов. 3. Строка начинается с буквы. 4. Строка не может начинаться любым из специальных символов, указанных в табл. 6.1. 5. Строка не может содержать управляющих символов. Следующие примеры помогут вам более детально понять различия между строками общего вида и именами: 1. «A ROSE IS A ROSE IS A ROSE» не является именем Турбо-Пролога, так как содержит пробелы.»A_ROSE_IS_A_ROSE_IS_A_ROSE» является именем Турбо-Пролога. 2. «123LOTUS» не является именем Турбо-Пролога, так как оно начинается с цифры, а «LOTUS123» уже является специальной строкой Турбо-ПРОЛОГа, так как порядок следования символов был изменен так, что цифры теперь следуют за буквами. 3»._intelligence» не является именем Турбо-Пролога, так как она начинается специальным символом «_». Но «artificial_» это строка Турбо-Пролога; наличие подчерка не влияет на ее «допустимость», так как подчерк не первый символ. 4. Ctrl-P не является именем Турбо_Пролога, так как это управляющий символ. Турбо-Пролог имеет встроенные предикаты, позволяющие проверять является ли строка специальной строкой Турбо-Пролога. Синтаксис этого предиката следующий: isname(String). Если String это строка Турбо-Пролога, то предикат будет успешным; в противном случае он будет неуспешным. Программа Isname (листинг 6.14) использует предикат isname для проверки, что строка есть имя Турбо-Пролога. Диалог с программой показан на рис.6.12. В программе Isname правило test_good_names (проверка допустимых имен) использован предикат isname, проверяющий является ли employee_ID именем Турбо-Пролога. Так как это есть имя Турбо-Пролога, то правило успешно и сообщение на экране следующее: employee_ID is a legal name Это правило проверяет также $employee_ID. Так как префикс $ делает его недопустимым именем Турбо-Пролога, то предикат isname неуспешен, но отрицание предиката not(isname($employee_ID)). успешно, и поэтому правило test_bad_names (проверка недопустимых имен) успешно. Сообщение на экране имеет вид: $employee_ID is not a legal name ( ………. недопустимое имя) Предикат isname весьма удобен при программировании на Турбо-Прологе операций преобразования исходного текстового файла на одном языке в исходный текстовый файл на другом языке. Если команда введена, то isname может определить будет ли она преобразована в формат Турбо-Пролога в соответствии с определением имени, принятом в языке. Другое использование isname это обработка введенных с клавиатуры данных и генерация исходных (текстовых) файлов, которые могут быть скомпилированы Турбо-Прологом. Рисунок 6.12. Упражнение 6.11. Напишите программу, которая проверит являются ли следующие строки допустимыми именами: 1. %COPY 2. _town 3. addres 4. Prescription 5. iodochlorhydroxyquin 6.12 Формирование атомов из строк Атом (token) это последовательность символов. Такая группа символов является специальной строкой Турбо-Пролога. Атом может быть числом. Если число имеет предшествующий знак (+ или -), то этот знак рассматривается как отдельный атом. Атом может быть символом, но только не символом пробела. Переменные используются для передачи параметров. Переменные являются атомами, но не все атомы есть переменные. Турбо-Пролог имеет встроенные предикаты для извлечения атома из строки. Это предикат fronttoken. Его синтаксис следующий: fronttoken(String, Token, Rest_of_string). Либо String должна быть означена, либо оба Token и Rest_of_string должны быть означены. Если первый символ строки есть символ из групп с 1 по 4 в табл.6.1, то этот символ присваивается переменной Token, а оставшиеся символы присваиваются Rest_of_string. Либо, если строка имеет значение, то Token получает это значение, а 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 AI.BAS»,Token,Rest) присваивает переменной Token значение «$», а переменной Rest значение «RUN AI.BUS». Программа Token1 (листинг 6.15) иллюстрирует эти примеры. Результат работы этой программы показан на рис.6.13. Заметьте, что результаты существенно различаются в зависимости от типа аргументов. Предикат fronttoken может быть использован в правиле преобразования строки в список атомов. Это правило аналогично правилу, которое использовалось для преобразования строки в список аргументов: convers(Str, [Head|Tail]) : fronttoken(Str,Head,Str1),!, convers(Str1,Tail). convers(_ , []). Листинг 6.15. Вариант предиката convers(_ , [ ]) будет успешен, если список будет пустым, и это условие определяет точку, с которой должно быть начато преобразование. Например, строка «one two three» должна быть преобразована в список атомов: [one, two, three] . Рисунок 6.13. Программа Token2 (листинг 6.16) демонстрирует преобразование строк в список атомов. Результат программы показан на рис.6.14. Заметьте, что строка «STARS AND STRIPES» преобразуется в список символов: [«STARS», «AND», «STRIPES»]. Пробелы были устранены. Листинг 6.16. Рисунок 6.14. Упражнение 6.12. Запустите программу Token2 и введите следующие внешние цели: 1. convers(«from New_York to Los_Angeles»). 2. convers(«123 infinity»). 3. convers(«1 2 34 9 636»). 4. convers(«%%$@@##»). Какие будут результаты? Программа Token3 (листинг 6.17) является вариантом Token2. Эта программа использует внутренную цель, которая является правилом do_convert_and_print. Эта цель состоит из двух подцелей. Подцель convers преобразует строку «STARS AND STRIPES FOREVER» в список атомов, а подцель print_list печатает получившийся список. Результат работы программы показан на рис.6.15. Листинг 6.17. Рисунок 6.15. Упражнение 6.13. Модифицируйте программу Token3 так, чтобы она преобразовывала следующие строки в списки: «C>DIR C:\INVERT\AUTOPRT.FIL» «A>TYPE ACCOUNTS.BUS» 6.13. Преобразование строк в списки атомов с функторами. Часто удобно преобразовывать данные, введенные с клавиатуры, в термы, которые могут быть обработаны Турбо-Прологом. Например, вам может потребоваться поместить множество утверждений в базу данных в следующем виде: fruit(apple). fruit(peach). fruit(orange). fruit(pear). Эти утверждения могут быть построены на основе строки apple peach orange pear. Этот метод включает преобразование строки в список, который содержит имя функтора. В данном случае имя функтора есть fruit (фрукт). Результатом преобразования является следующий список: [fruit(apple),fruit(peach),fruit(orange),fruit(pear)]. Этот список может быть записан в базу данных (или файл). Соответствующее правило на Турбо-Прологе может быть построено таким образом, чтобы каждый элемент этого списка находился на отдельной строке. Это правило должно присоединять точку к каждому элементу с функтором. После построения правила для записи списка необходимо построить правило преобразования. Предикат fronttoken является основной компонентой этого правила. Для соответствующего примера будет использоваться transf. Это правило должно удовлетворять нескольким требованиям. Во-первых, оно должно отображать пустую строку в пустой список: transf(««, []). В начальный момент преобразования это правило должно быть успешным при пустом списке. Цель этого правила состоит в трансформации строки в список. Во время этого процесса правило также проверяет тип каждого элемента. Если элемент является целым числом, то выбирается имя функтора n; если элемент является символом, то имя функтора есть ch; если элемент является строкой, то имя функтора s. Целиком это рекурсивное правило имеет следующий вид: transf(Str, [Token_head|Token_tail]) : fronttoken(Str, Symbol_type, Strx), choose_token(Symbol_type, Token_head), transf(Strx, Token_tail). Подправило chose_token имеет вид: choose_token(S,n(N)) :- str_int(S,N). choose_token(S,c©) :- str_char(S,C). choose_token(S,s(S)) :- isname(S). Правило transf допускает строки, состоящие из символов и чисел. Когда это правило вызывается, значение Symbol_type может быть числом, символом или именем. Если это число, то choose_token определяет этот тип, и тогда Token_head имеет вид n(N), где N - число. Если объект является символом, то правило choose_token присваивает Token_head строку вида c©, где C символ. Если объект является строкой, то Token_head имеет вид s(S), где S - строка. Программа Token4 (листинг 6.18) использует это правило трансформации. Раздел domains включает объявления трех типов атомов и объявления типа для token_list, являющегося списком, каждый элемент которого есть атом. Листинг 6.18. Два возможных варианта внешней цели могут иметь следующий вид: transf(«STARS AND STRIPES», FT). и transf(«LOTUS 123», FT). Результат ввода этих целей показан на рис.6.16. В первом списке все элементы имеют тип string, в то время как во втором списке содержатся смешанные типы: тип string для первого элемента и тип integer для второго элемента. Рисунок 6.16. Упражнение 6.14. Запустите программу Token4 и введите следующие цели: 1. transf(«beyond the year 2000»,L) 2. transf(«THREE SMALL HATS DO NOT MAKE ONE BIG HAT»,L) 3. transf(«Y = 27 * X + 6»,L) Какой результат будет в каждом случае? Обзор содержания главы В этой главе вы узнали как используется набор символов Турбо-Пролога, их представление при помощи кода ASCII и как записывать и использовать эти коды. Вы так же узнали, как пользоваться встроенными предикатами для обработки строк: str_len для нахождения длины строки, concat - для соединения двух строк, frontstr - для расщепления строки на подстроки, и fronttoken для выборки атома из строки. Вы так же узнали как преобразовывать элементы данных одного типа в элементы данных другого типа: строку из прописных букв в строку из строчных букв и наоборот, целые числа в действительные и наоборот, символы в строки и наоборот, а так же символы в ASCII код. Эти средства использовались в двух ситуациях: предикат frontchar использовался для правила преобразования строки в список символов, а предикат fronttoken использовался для построения правила преобразования строки в список атомов с функторами. Эти применения демонстрируют использование обработки строк при преобразовании входной строки в формат, воспринимаемый Турбо-Прологом. Эти применения весьма полезны при построении правил для модулей, реализующих интерфейс программы на Турбо-Прологе с пользователем. Они так же полезны при подготовке данных для их более простой обработки и хранения. Надписи на рисунках главы 6 N рисунка N надписи и ее текст 6.1. 6.2. 6.3. 6.4. 6.5. 6.6. 6.7 6.8. 6.9. 6.10. 6.11. 6.12. 6.13. 6.14. 6.15. 6.16. - 29 Названия таблиц главы 6 =====Листинги программ главы 6===== 45 Листинг 6.9. /* Программа: Conversions1 Файл:PROG0609.PRO */ /* Назначение: Демонстрация преобразования типов данных */ predicates do_conversions goal do_conversions. clauses do_conversions : upper_lower(«STARS AND STRIPES»,S1), write(«STARS AND STRIPES»),nl, write(S1),nl,nl, upper_lower(S2,»one day at a time»), write(«one day at a time»),nl, write(S2),nl,nl, write(«T»),nl, str_char(«T»,C1), write(C1),nl,nl, write(«U»),nl, char_int(‘U’,N1), write(N1),nl. 47 Листинг 6.10. /* Программа: Conversions2 Файл:PROG0610.PRO */ /* Назначение: Демонстрация преобразования: */ /* (1) действительного числа в целое */ /* (2) целого числа в действительное */ /* (3) строки в символ */ predicates conv_real_int(real,integer) conv_int_real(integer,real) conv_str_symb(string,symbol) goal X1 = 5432.765, conv_real_int(X1,N1),nl,nl, N2 = 1234, conv_int_real(N2,X2),nl,nl, S = «TURBO PROLOG», conv_str_symb(S,Sb),nl. clauses conv_real_int(R,N) : R = N, write(«Input real - «,R),nl, write(«Output integer - « N). conv_int_real(N,R) : N = R, write(«Input integer - «,N),nl, write(«Output real - «,R). conv_str_symb(S,Sb) : S = Sb, write(«Input string- «,S),nl, write(«Output symbol - «,Sb). 49 Листинг 6.11. /* Программа: Frontchar Файл:PROG0611.PRO */ /* Назначение: Демонстрация использования предиката*/ /* frontchar(строка,первый_символ,строка) */ predicates print_all goal print_all. clauses print_all :frontchar(Str1,’A’,»BCDEF»), nl,write(« Str1 = «, Str1), 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). _ 51 Листинг 6.12. /* Программа: Charlist1 Файл:PROG0612.PRO */ /* Назначение: Демонстрация преобразования строки */ /* в список символов с использованием */ /* предиката frontchar */ domains char_list = char * str = string predicates conver(str, char_list) clauses conver(««,[]). conver(Str, [Head|Tail]) : frontchar(Str,Head,Str1), conver(Str1,Tail). 52 Листинг 6.13. /* Программа: Charlist2 Файл:PROG0613.PRO */ /* Назначение: Демонстрация преобразования строки */ /* в список символов с использованием */ /* предиката frontchar */ domains char_list = char * str = string predicates conver(str, char_list) print_list(char_list) do_convert_and_print goal do_convert_and_print. clauses conver(««,[]). conver(Str, [Head|Tail]) : frontchar(Str,Head,Str1), conver(Str1,Tail). print_list([]). print_list([Head|Tail]) : write(Head,» «), print_list(Tail). do_convert_and_print : nl,nl, write(«STARS AND STRIPES»),nl,nl, conver(«STARS AND STRIPES»,List), print_list(List), nl,nl, write(« All done!»),nl. 54 Листинг 6.14. /* Программа: IsnameФайл:PROG0614.PRO */ /* Назначение: Демонстрация использования встроенного */ /* предиката isname(строка). */ predicates test_good_names test_bad_names goal test_good_names, test_bad_names. clauses test_good_names : Name = «employee_ID», isname(Name), nl, write(Name, « is a legal name.»). test_bad_names : Name = «$employee_ID», not(isname(Name)), nl, write(Name, « is not a legal name!»). - 55 Листинг 6.15. /* Программа: Token1Файл:PROG0615.PRO */ /* Назначение: Демонстрация использования встроенного */ /* предиката */ /* fronttoken (строка,атом,остаток_строки). */ predicates print_all goal print_all. clauses print_all :fronttoken(Str1, «Default»,»Directory»), nl,write(« Str1 = «,Str1), fronttoken(Str2, «$default»,»$directory»), nl,write(« Str2 = «,Str2), fronttoken(«Pointer»,Token1,Rest1), nl,write(« Token1 = «,Token1), nl,write(« Rest1 = «,Rest1), fronttoken(«$Command», Token2,Trail1), nl,write(« Token2 = «,Token2), nl,write(« Trail1 = «,Trail1), fronttoken(«$$command», Token3,Trail3), nl,write(« Token3 = «,Token3), nl,write(« Trail3 = «,Trail3), fronttoken(Str3, «!default»,»$default»), nl,write(« Str3 = «,Str3), fronttoken(«$RUN AI.BAS»,Token4,Rest2), nl,write(« Token4 = «,Token4), nl,write(« Rest2 = «,Rest2). _ - 57 Листинг 6.16. _ /* Программа: Token2Файл:PROG0616.PRO */ /* Назначение: Демонстрация преобразования стоки в */ /* список строк при помощи предиката */ /* fronttoken (строка,атом,остаток_строки). */ domains str_list = symbol * str = string predicates convers(str,str_list) clauses convers(Str,[Head|Tail]) :fronttoken(Str,Head,Str1),!, convers(Srt1,Tail). convers(_,[]). _ 58 Листинг 6.17. /* Программа: Token3Файл:PROG0617.PRO */ /* Назначение: Демонстрация преобразования стоки в */ /* список строк при помощи предиката */ /* fronttoken (строка,атом,остаток_строки). */ domains str_list = symbol * str = string predicates convers(str,str_list) print_list(str_list) do_convert_and_print goal do_convert_and_print. clauses convers(Str,[Head|Tail]) :fronttoken(Str,Head,Str1),!, convers(Srt1,Tail). convers(_,[]). print_list([]). 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(List), nl,nl, write(«All done !»),nl. 60 Листинг 6.18. /* Программа: Token4Файл:PROG0618.PRO */ /* Назначение: Демонстрация преобразования стоки в */ /* список атомов с функторами*/ domains token_type = n(integer); c(char); s(string) token_list = token_type * predicates transf(string,token_list) choose_token(string,token_type) clauses transf(««,[]). transf(Str, [Token_head|Token_Tail]) : fronttoken(Str, Symbol_type, Strx), choose_token(Symbol_type, Token_head), transf(Str, Token_tail). choose_token(S,n(N)) : str_int(S,N). choose_token(S,c©) : str_char(S,C). choose_token(S,s(S)) : isname(S). !!Рекомендуем: ОбучениеСемейная Энциклопедия ЗдоровьяКонсультация аналитикаОглавлениеГлавная сайта

Обсуждение

Ваш комментарий:
T B​ N᠎ O X
 
project/prolog/stroki.txt · Последние изменения: 2017/01/09 22:51 (внешнее изменение)

Вы можете оставить свои комментарии в разделе "Обсуждение".
Рекомендуем оформить подписку на новости данного раздела. Для этого нажмите на кнопку "Подписаться", расположенную справа снизу каждой страницы (знак конверта).


www.work-zilla.com

Индекс цитирования