Скачиваний:
38
Добавлен:
22.05.2015
Размер:
164.35 Кб
Скачать

Обработка строк

В классе string существует большое число предикатов обработки строк. В данной лабораторной работе мы будем использовать два предиката:

string::concat(string First,string Second) -> string Out.

string::front(string Source,charCount Count,string First,string Last) determ (i,i,o,o).

Пример 11. Разработаем предикат, который будет преобразовывать русский текст в английские буквы. Иногда эта задача называется транслитерация, то есть запись слов одного языка буквами другого языка. Для решения этой задачи надо на каждом витке цикла отделять очередную букву от русского текста, заменять её одной или несколькими буквами английского языка, присоединять эти английские буквы к текущему английскому тексту и рекурсивно вызывать предикат транслитерации до тех пор, пока русский текст не станет пустым.

Исходный код программы можно представить в таком виде:

implement main

   open core, console

constants className = "com/visual-prolog/main". classVersion = "$JustDate: $$Revision: $".

class facts замена : (string Рус, string Анг).

class predicates транслитер : (string Рус, string Анг)  procedure (i,o).

clauses classInfo(className, classVersion).

транслитер("","") :- !. транслитер(Русс,string::concat(АнгБук,Англ)) :- string::front(Русс,1,РусБук,Русс1),    замена(string::toLowerCase(РусБук),АнгБук),!,    транслитер(Русс1,Англ). транслитер(Русс,string::concat(Знак,Англ)) :- string::front(Русс,1,Знак,Русс1),    транслитер(Русс1,Англ).

замена("а","a"). замена("б","b"). замена("в","v"). замена("г","g"). замена("д","d"). замена("е","e"). замена("ё","jo"). замена("ж","zh"). замена("з","z").  замена("и","i"). замена("й","j"). замена("к","k"). замена("л","l"). замена("м","m"). замена("н","n").  замена("о","o"). замена("п","p"). замена("р","r"). замена("с","s"). замена("т","t"). замена("у","u").  замена("ф","f"). замена("х","kh"). замена("ц","ts"). замена("ч","ch"). замена("ш","sh"). замена("щ","sch").  замена("ъ",""). замена("ы","y"). замена("ь",""). замена("э","y"). замена("ю","ju"). замена("я","ya").

run():-

   init(),

   транслитер("Жезл и скипетр!",АнглТекст),

   write(АнглТекст),nl,

   write("\nПрограмма завершена"),

   _=readchar().

end implement main

goal

   mainExe::run(main::run).

Рекурсивный предикат транслитер(РусТекст,АнглТекст) состоит из трёх предложений. Первое предложение описывает условие останова рекурсии: транслитер("","") :- !. Это означает, что английский текст равен пустой строке тогда, когда русский текст равен пустой строке. Если это условие выполняется, то происходит отсечение остальных правил этого предиката. Иначе – правила выполняются.

Второе предложение является рекурсией и описывает тот случай, когда очередной символ русского текста является буквой. С помощью предиката замена(string::toLowerCase(РусБук),АнгБук) русская буква РусБук переводится в нижний регистр, после чего ей находится замена соответствующей английской буквой. Эта английская буква конкатенируется слева к английскому тексту, возвращаемому рекурсией.

Третье предложение описывает случай, когда очередной символ русского текста не является буквой. Тогда этот символ не заменяется, а конкатенируется слева к английскому тексту. Третьим предложением обрабатываются знаки пунктуации, пробелы, табуляции, символы перевода в начало строки и на следующую строку.

Задание 11. Разработать программу транслитерации английского текста русскими буквами.

Задание 12. Разработать программу преобразования русского числительного в число. Например: “сто двадцать пять”  125. Преобразование ограничить диапазоном чисел от нуля до 999.

Задание повышенной сложности 3. Разработать программу преобразования числа в числительное. Например: 125  “сто двадцать пять”. Преобразование ограничить диапазоном чисел от нуля до 999. Справка: такая задача имеет самостоятельное название Untaco.

Задание 13. Разработать программу преобразования римских чисел в арабские в диапазоне от нуля до 999. Подсказка: воспользуйтесь предикатом замены, расположив предложения этого предиката в правильном порядке:

замена (1000, "M").

замена (900, "CM").

замена (500, "D").

замена (400, "CD").

замена (100, "C").

замена (90, "XC").

замена (50, "L").

замена (40, "XL").

замена (10, "X").

замена (9, "IX").

замена (5, "V").

замена (4, "IV").

замена (1, "I").

Задание повышенной сложности 4. Разработать программу преобразования арабских чисел в римские в диапазоне от нуля до 999.

Соседние файлы в папке Лабораторные работы