PROLOG_Labs / Лабораторная работа 7
.docЛАБОРАТОРНАЯ РАБОТА №7
ТЕМА: Строки в Прологе.
ЦЕЛЬ: Научиться использовать возможности Пролога по организации работы со строками при написании различных программ.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
1. frontchar(Строка,Символ,ОстальнаяСтрока)
(string,char,string) -
(i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i)
Предикат позволяет сформировать строку (ОстальнаяСтрока), которая содержит символы исходной строки (Строка),начиная с Символ.Поскольку параметры могут быть как входными, так и выходными, данный предикат может использоваться достаточно широко для работы со строками. Предлагаемые примеры иллюстрируют некоторые возможные варианты использования этого предиката.
Goal: frontchar("TPROLOG",CH,REST) % выделение пеpвого символа и подстpоки за ним
CH=T, REST=PROLOG
1 Solution
Goal: frontchar("TPROLOG",'T',REST) % выделение подстpоки после буквы T
REST=PROLOG
1 Solution
Goal: frontchar("TPROLOG",'P',"ROLOG") % сpавнение стpок
False
Goal: frontchar(X,'T',"PROLOG") % фоpмиpование стpоки
X=TPROLOG
1 Solution
2. fronttoken(Строка,Лексема,ОстальнаяСтрока)
(string,string,string) - (i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i)
Предикат позволяет гибко работать с лексемами, в качестве которых могут быть имена (в соответствии с синтаксисом Пролога), или числа (целые или вещественные), или специальные символы.
Goal: fronttoken("all boys do fine",TOK,REST)
TOK=all, REST= boys do fine
1 Solution
Goal: fronttoken("all+boys do fine",TOK,REST),
fronttoken(REST,TOK1,_) % выделение двух лексем
TOK=all, REST=+boys do fine, TOK1=+
1 Solution
Goal: fronttoken("22all boys do fine",TOK,REST)
TOK=22, REST=all boys do fine
1 Solution
Goal: fronttoken("22.66all boys do fine",TOK,REST)
TOK=22.66, REST=all boys do fine
1 Solution
Goal: fronttoken("-22.66all boys do fine",TOK,REST)
TOK=-, REST=22.66all boys do fine
1 Solution
Goal: fronttoken(".66all boys do fine",TOK,REST)
TOK=., REST=66all boys do fine
1 Solution
3. frontstr(Длина,ВходнаяСтрока,НачальнаяСтрока,ОстальнаяСтрока)
(integer,string,string,string) - (i,i,o,o)
Предикат позволяет формировать из ВходнаяСтрока строки НачальнаяСтрока заданной длины и ОстальнаяСтрока.
Goal: frontstr(3,"All boys do fine",STR1,STR2)
STR1=All, STR2= boys do fine
1 Solution
Goal: frontstr(9,"All boys do fine",STR1,STR2)
STR1=All boys , STR2=do fine
1 Solution
Goal: frontstr(0,"All boys do fine",STR1,STR2)
STR1=, STR2=All boys do fine
1 Solution
Goal: frontstr(-1,"All boys do fine",STR1,STR2)
No Solution
Goal: frontstr(20,"All boys do fine",STR1,STR2)
No Solution
4. concat(Строка1,Строка2,Строка3)
(string,string,string) - (i,i,o) (i,o,i) (o,i,i) (i,i,i)
Предикат реализует сцепление строк, т.е. операцию Строка3 = Строка1 + Строка2, а также pазличные функции, связанные со сцеплением.
Goal: concat("aaa","bbb",X)
X=aaabbb
1 Solution
Goal: concat("aaa","bbb","aaabbb")
True
Goal: concat("aaa","bbb","aaa----bbb")
False
Goal: concat(X,"bbb","aaa----bbb")
X=aaa----
1 Solution
Goal: concat("aaa",X,"aaa----bbb")
X=----bbb
1 Solution
5. str_len(Строка,Длина)
(string,integer) - (i,i) (i,o) (o,i)
В зависимости от типа параметров предикат выполняет разные функции, связанные с длиной строки.
Goal: str_len("abc",Len) % какова длина стpоки?
Len=3
1 Solution
Goal: str_len("abc",3) % длина стpоки pавна 3?
True
Goal: str_len(STR,15),writef("|%|\n",STR)
| |
STR=
1 Solution
6.isname(ПараметрСтрока)
(string) - (i)
Предикат осуществляет проверку параметра-строки на соответствие синтаксису Турбо-Пролога.
Goal: isname("Dan")
True
Goal: isname("2Leo")
False
Goal: isname("_JON")
True
Goal: isname("kelly_rich")
True
Goal: isname("_")
True
Goal: isname("abc1def2")
True
7. format(ВыходнаяПеременная,ФорматСтроки,Переменная | СписокКонстант*)
Предикат служит для задания формата вывода для строки ВыходнаяПеременная. Значения ФорматСтроки смотри в описании пpедиката writef .
Goal: format(X,"this % the %'st % test",is,1,"small")
X=this is the 1'st small test
1 Solution
Goal: format(X,"REALS: Default=%, Exp=%e, Shortest=%g",99E9, 99E9, 99E9)
X=REALS: Default=98999999999.99999989, Exp=9.9E+10,
Shortest=9.9E+10
1 Solution
Goal: format(X,"char=%c, int=%, unsigned=%u,hex=%x",97,-1,-1, -1)
X=char=a, int=-1, unsigned=65535, hex=FFFF
1 Solution
ПРАКТИЧЕСКОЕ ЗАДАНИЕ
Выполнить задание по индивидуальному номеру варианта, полученного у преподавателя.
-
В файле, содержащем определенное количество слов (что-то вроде словарного запаса), обеспечить возможность поиска слова, введенного с клавиатуры.
-
Из файла, содержащего несколько строк, получить первую строку, в которой найдется слово, введенное пользователем для соответствующего поиска.
-
Создать программу, которая склоняет по падежам слово мужского рода, оканчивающееся на согласную букву. Ввод слова должен осуществляться с клавиатуры.
-
Проверить, является ли введенная пользователем строка электронным адресом.
-
Пусть имеются два файла: файл существительных и файл глаголов. Введенные одновременно с клавиатуры несколько слов должны получить свою классификацию: существительное или глагол.
-
Написать программу, которая выделяет из введенной с клавиатуры строки первых два и последних два слова. Вывести их на экран.
-
Написать программу, которая анализирует каждое слово из введенной пользователем строки и выдает информацию, можно ли его использовать в качестве имени Пролога.
-
Создать программу, которая из введенной пользователем строки выбирает слова, длина которых не превышает 7 символов. Вывести их на экран.
-
Написать программу, которая из строки, введенной с клавиатуры, выбирает слова, в которых заданная пользователем буква встречается не менее 3 раз. Вывести эти слова.
-
Написать программу, которая из строки, введенной с клавиатуры, выбирает все встречающиеся в ней цифры и печатает их на экране отдельной строкой.
-
Написать программу, которая подсчитывает во введенной с клавиатуры строке количество букв, равных букве, заданной пользователем.
-
Написать программу, которая выделяет из введенной строки те слова, в которых содержаться цифры, и печатает их на экране.
-
Написать программу, которая из введенной с клавиатуры строки выделяет все символы пунктуации и печатает их на экран отельной строкой.
-
Написать программу, которая подсчитывает длину каждого слова из введенной с клавиатуры строки, выводи соответственно слово и его длину, а также определяет то слово, у которого наибольшая длина.
КОНТРОЛЬНЫЕ ВОПРОСЫ
-
Как выделить атомы из строки?
-
Опишите предикат, позволяющий отделять символы.
-
Как преобразовать слово в список символов? Объясните процедуру.
-
Как преобразовать строку в список слов? Объясните процедуру.
-
Какой предикат позволяет определить, можно ли считать слово именем Пролога?
-
Как подсчитать длину строки?
-
Для чего предназначен предикат concat?
-
Как выделить из строки последовательность символов, заданной длины?