Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФиЛП_материалы / Материалы / Prolog / ЛаборПролог.doc
Скачиваний:
37
Добавлен:
01.06.2015
Размер:
84.48 Кб
Скачать

Лабораторная работа № 3 Работа с файлами и строками

Цель работы: приобретение навыков работы со строками, файлами, списками, необходимыми для обработки естественно – языковых конструкций.

Пример. Из заданного файла считать строки и сформировать из них список. Полученный список разделить на два списка, при этом в первый список результата попадут те строки, у которых число гласных четное, а во второй те, у которых нечетное.

Назначение предикатов:

read_list(list)читает из заданного файла строки и формирует из них исходный список;

sort(list_liter,list,list,list)распределяет строки по спискам результата. Первый параметр – список, задающий число гласных букв в соответствующем списке строк, который связан со вторым параметром. Третий параметр – результирующий список с четным числом гласных букв, а четвертый – с нечетным. Строки, не содержащие ни одной гласной буквы, не попадают в результирующие списки;

анализ(string,integer,integer) подсчитывает число гласных букв в строке. Первый параметр – строка, второй – текущая сумма гласных букв, третий – используется для передачи результата подсчета вызывающему analiz предикату;

разбор(list,list_liter)для заданного списка строк формирует соответствующий ему список, содержащий для каждой строки подсчитанное количество гласных букв;

гласная(char)задает факты, позволяющие идентифицировать гласные буквы;

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

DOMAINS

list=string*

list_liter=integer*

file=file_in

PREDICATES

nondeterm read_list(list)

nondeterm sort(list_liter,list,list,list)

nondeterm анализ(string,integer,integer)

nondeterm разбор(list,list_liter)

nondeterm гласная(char)

nondeterm run

CLAUSES

гласная('а').гласная('е').гласная('о').гласная('и').гласная('у'). гласная('ю').гласная('я').гласная('э').

read_list([X|List]) :- not(eof(file_in)),readln(X),read_list(List).

read_list([]).

sort([],[],[],[]) :- !.

sort([K|Q],[_|L],L1,L2) :- K=0,sort(Q,L,L1,L2).

sort([K|Q],[X|L],[X|L1],L2) :- K/2=K div 2,sort(Q,L,L1,L2).

sort([_|Q],[X|L],L1,[X|L2]) :- sort(Q,L,L1,L2).

разбор([],[]) :- !.

разбор([X|L],[K|Q]) :- анализ(X,0,K),разбор(L,Q).

анализ("",N,N) :- !.

анализ(X,N,M) :- frontchar(X,Ch,R),гласная(Ch),N1=N+1,анализ(R,N1,M).

анализ(X,N,M) :- frontchar(X,_,R),анализ(R,N,M).

run :- write("Введите имя файла, содержащего исходные строки - "),

readln(FileIn),openread(file_in,FileIn),

readdevice(file_in),

read_list(List),readdevice(keyboard),closefile(file_in),

разбор(List,Q),sort(Q,List,L1,L2),

write(" Исходный список строк"),nl,write(List),nl,

write(" Список строк с четным числом гласных букв"),nl, write(L1),nl,

write(" Список строк с нечетным числом гласных букв"),nl, write(L2),nl.

GOAL

run.

Рекомендация. Если вам покажутся слишком сложными рекурсивные функции с многими переменными, упростите решение задачи. Соедините рекурсивные вызовы с механизмом assert, findall, аналогичным 2-й работе.

Варианты заданий

(Слово “текст” в задании подразумевает несколько слов в строке)

1. Считать из файла слова (каждое слово записано на отдельной строке), определить число гласных и согласных букв в каждом слове и результаты записать в два списка. По окончании работы списки сохранить в новом файле.

2. Считать из файла некоторый текст, все слова текста разделить на два списка, в первый войдут слова, начинающиеся с гласной, во второй – с согласной. Полученные списки сохранить в некотором файле.

3. Считать из файла слова и разделить их на два списка по следующему правилу: слово попадает в первый список, если в нем больше гласных букв, и во второй, если больше согласных. Полученные списки сохранить в некотором файле.

4. Считать из файла текст и выполнить его синтаксический анализ, определив, сколько использовано гласных букв, результат записать в некоторый файл.

5. Считать слова из файла. Если число согласных букв в слове четное, то его записывают в один список, если нечетное, – в другой. Результаты сохранить в файле.

6. В файле записаны слова, некоторые из них повторяются. Требуется считывать слова из этого файла и формировать из них список, в котором повторов не будет. Результат записать в файл.

7. Считать из файла слова и сформировать список из тех слов, в которых встречается более двух согласных букв подряд. Результат записать в файл.

8. Считать из файла слова и создать список из тех слов, которые содержат внутри себя определенную последовательность из трех или более букв (задается пользователем). Результат вывести в файл.

9. Считать из файла слова и разделить их на два списка по следующему критерию: в первый список попадают слова, имеющие одинаковое количество гласных и согласных, во второй – остальные слова. Результат записать в файл.

10. Считать из файла слова и сформировать два списка из тех слов, в которых количество согласных или гласных (на выбор) букв больше установленного, и из тех, в которых оно меньше установленного (вводится с клавиатуры). Результаты вывести в файл.

11. Считать из файла слова и выписать в список слова по возрастанию общего количества гласных (согласных) букв в слове. Результат вывести в файл.

12. Считать из файла слова и сформировать список из длин всех встречающихся слов (без повторов). Результат вывести в файл.

Контрольные вопросы:

1. Чем принципиально отличается рекурсивная функция read_list от рекурсивной функции печати списка?

2. Как организуется рекурсия с помощью функции frontchar?

7

Соседние файлы в папке Prolog