Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Prolog] Анализатор текста


Автор: kresh 19.4.2008, 21:51
Всем привет! Вот очередной семестр и блин начали изучать пролог(чудесный язык прогараммирования) ,но вот только что-то не не идет он у меня не могу перестроиться с С++ на Пролог,поэтой причине прошу вашей помощи в написании программы по лабораторной работе 

Написать программу анализатор текста

которая для указанного текстового файла выполняет следущие операции:

-вывод содержимого файла на экран
-подсчет количества строк в файле
-вывод из текстового файла строки с заданным номером
-вывод самой короткой строки
-подсчет сколько раз в файле встречается заданный символ
-вывод строк,в которых встречаются числовые данные
-поиск в файле заданного слова

 smile 

заранее благодарю! smile 

Автор: kresh 12.1.2009, 22:28
19.4.2008, 21:51  с этого времени не нашлось ни одного знатока prolog smile  smile 

Автор: Фантом 12.1.2009, 23:01
Ну почему же? Просто:
1) Это не "помощь в написании", это просто написание. Почему кто-то должен делать за Вас Вашу работу?
2) Код значительной части всего этого зависит от используемого Вами транслятора, который Вы не удосужились сообщить.

Автор: kresh 19.2.2011, 23:51
вот текст программы,может кому поможет smile 
Код

DOMAINS /* раздел описания доменов */
F_N = String
file=f
N,C, M = integer
database -db
files(string)
database -summ
summ(integer)
database -summ1
summ1(integer)
database -shot
shot(string)
database -viv
timer(integer)
PREDICATES
m(char) /* этот предикат реализует выполнение
соответствующего пункта меню */
menu /* этот предикат реализует вывод меню и
обработку выбора пользователя */
start(String) /* этот предикат проверяет наличие файла
с базой на диске и либо загружает
факты из нее во внутреннюю базу данных,
если такой файл существует, либо создает
этот файл, если его не было */
write_file(string)
write_file_main()
nakop(char,char)
file_rek(file,char)
sbor(char)
fwriteF(char,integer)
rep(FILE)
readline(FILE)
sb
malen
readshot(FILE)
prov(string)
sh(string)
muStr(integer)
viv(FILE,integer)
stroka(integer,string,integer)
chis
chisla(file)
chis_sr(char)
chet(char)
chis_v
CLAUSES
menu:-
makewindow(1,2,7,"Работа с файлом",0,0,25,80),
clearwindow, /* очистка текущего окна */
write("1 - Вывести файл"),nl,
write("2 - Число вхождений символа"),nl,
write("3 - Число строк в файле"),nl,
write("4 - Самая короткая строка"),nl,
write("5 - Вывести заданную строку"),nl,
write("6 - Вывести все строки в которых есть числа"),nl,
write("0 - Выйти"),nl,
readchar(C), /* читаем символ с клавиатуры */
m(C). /* вызываем выполнение соответствующего пункта
меню */
m('6'):-
clearwindow,
chis,
chis_v,
retractall(_,summ1),
readchar(_), /*Ждем ввода любого символа*/
menu.
m('2'):-
clearwindow,
write("Введите символ"),nl,
readchar(C),
sbor(C),
readchar(_),
menu.
m('3'):- /*считает количество строк*/
clearwindow,
sb,
readchar(_),
menu.
m('4'):-
clearwindow,
malen,
readchar(_),
menu.
m('1'):-
clearwindow,
write_file_main(),
readchar(_),
menu.
m('5'):-
clearwindow,
write("Введите номер строки"),
readint(I),
muStr(I),
readchar(_),
menu.
m('0'):-
clearwindow,
removewindow.
m(_):-
menu. /* если пользователь по ошибке нажал клавишу,
отличную от тех, реакция на которые
предусмотрена, ничего плохого
не произойдет, будет отображено меню
еще раз */
write_file(f):-
not(eof(f)),!, /*пока не конец файла выполняем ...*/
readchar(C),/*Cчитываем символ*/
write(C), /*выводим символ*/
write_file(f). /*повторям*/
write_file(_).
write_file_main():- /*Предикат вывода файла*/
files(F_N), /*Читаем в переменную имя файла*/
openread(f,F_N), /*Открываем файл на чтение*/
readdevice(f), /*Перенаправляем устройство чтения, из файла*/
write_file(f), /*Вызываем выше описаный предикат*/
closefile(f), /*Закрываем файл*/
readdevice(keyboard). /*Перенаправляем устройство чтения, с клавиатуры*/
write_file_main().
/***********************************************/
nakop(_,_).
nakop(C,Ch):-
C=Ch,!, /*Если символ введеный пользователем совпал с символом в файле*/
summ(M), /*берем значение из БЗ*/
NewM=M+1, /*Увелчиваем на 1*/
retract(summ(M)), /*удаляем предыдущее значение*/
assert(summ(NewM)). /*записываем новое*/
file_rek(f,C):-
rep(f), /*Предикат осуществляющий повторение действий до тех пор пока не закончится файл*/
readchar(Ch), /*Читаем символ из файла*/
nakop(C,Ch),
fail.
file_rek(_,_).
fwriteF(C,M):-
write("Символ '",C,"' встречается ",M ," раз"), /*выводим на экран результат*/
fail.
fwriteF(_,_).
sbor(C):- /*Предикат вывода числа вхождений символа в файл*/
files(F_N),
assert(summ(0)), /*вводим во внутреннюю БЗ 0*/
openread(f,F_N),
readdevice(f),
file_rek(f,C),
summ(M),
fwriteF(C,M), /*предикат для вывода результатов*/
closefile(f),
retract(summ(_),summ), /*обнуляем БЗ*/
readdevice(keyboard).
sbor(_).
/*************************************************/
sb:- /*Предикат подсчета количества строк в файле*/
files(F_N),
assert(summ(0)),
openread(f,F_N),
readdevice(f),
readline(f),
summ(Int),
write("Количество строк в файле: ", Int), /*Вывод результатов на экран*/
closefile(f),
retract(summ(_),summ),
readdevice(keyboard).
sb.
readline(f):-
rep(f),
readln(_), /*читаем строку из файла*/
summ(Int),
NeM=Int+1, /*Увеличиваем предыдущее значение на 1*/
retract(summ(Int)),
assert(summ(NeM)), /*Записываем новое значение*/
fail.
readline(_).
rep(_). /*предикат для осуществления цикла перемещения по файлу*/
rep(f):- not(eof(f)),rep(f).
/*************************************************/
malen:- /*Предикат определения самой короткой строки*/
files(F_N),
assert(summ(0)),
assert(shot("")), /*Задаем начальное значение*/
openread(f,F_N),
readdevice(f),
readshot(f),
shot(Str),
write("Самая короткая строка: ", Str),
closefile(f),
retract(shot(_),shot),
retract(summ(_),summ),
readdevice(keyboard).
malen.
prov(_).
prov(Ln):-
str_len(Ln,Int), /*Узнем длину строки*/
summ(Sum), /*Берем текущее значение строки*/
Sum>Int,!, /*Если строка короче то записываем ее и ее длину в соотв. БЗ*/
retract(summ(Sum)),
assert(summ(Int)),
shot(Str),
retract(shot(Str)),
assert(shot(Ln)).
sh(Ln):- /*Проверяем, если в базе нет строк, то записываем текущую, и ее длинну*/
shot(Str),
Str="",!,
retract(shot(Str)),
assert(shot(Ln)),
summ(Int),
retract(summ(Int)),
str_len(Ln,Sum),
assert(summ(Sum)).
sh(_).
readshot(f):-
rep(f),
readln(Ln), /*Читаем строку*/
sh(Ln),
prov(Ln),
fail.
readshot(_).
/**********************************************/
muStr(I):- /*предикат вывода строки по номеру*/
files(F_N),
assert(summ(1)),
assert(shot("")),
openread(f,F_N),
readdevice(f),
viv(f,I),
shot(Str),
write("Строка номер ",I," :",Str),
write('\n'),
closefile(f),
retract(shot(_),shot),
retract(summ(_),summ),
readdevice(keyboard).
muStr(_).
stroka(I,Ln,Int):-
I=Int,!, /*Если номер строки совпадает с введенным то записываем ее в БЗ*/
shot(Str),
retract(shot(Str)),
assert(shot(Ln)).
stroka(_,_,_).
viv(f,I):-
rep(f),
readln(Ln),
summ(Int), /*берем номер текущей строки*/
stroka(I,Ln,Int),
Nint=Int+1, /*увеличиваем счетчик текущей строки на 1*/
retract(summ(Int)),
assert(summ(Nint)),
fail.
viv(_,_).
/*******************************************/
chis:- /*Предикат вывода строк с числовыми данными*/
files(F_N),
assert(timer(0)),
openread(f,F_N),
readdevice(f),
chisla(f),
closefile(f),
retract(timer(_),viv),
readdevice(keyboard).
chis.
chis_v:- /*Предикат вывода найденных строк*/
summ1(I), /*Берем значение из БЗ*/
muStr(I), /*Подставляем в описаный ранее предикат Нахождения строки по заданному номеру*/
fail. /*и переходим к следующему значению БЗ*/
chis_v.
chet(C):-
C='\n',!, /*Проверяем , если текущий символ конец строки то увеличиваем счетчик строк на 1*/
timer(Int),
M=Int+1,
retract(timer(Int)),
assert(timer(M)).
chet(_).
chis_sr(C):-
char_int(C,Num), /*Берем его числовой код*/
chet(C),
Num>=48,Num<=57,!, /*если текущий символ является цифрой*/
readln(_), /*считываем всю оствщуюся строку*/
timer(Int),
retract(timer(Int)), /*увеличиваем счетчик текущей строки на 1, и записываем номер строки в БЗ*/
M=Int+1,
assert(timer(M)),
assert(summ1(Int)).
chis_sr(_).
chisla(f):-
rep(f),
readchar(C),/*читаем символ*/
chis_sr(C),
fail.
chisla(_).
/*******************************************/
start(F_N):-
existfile(F_N),!, /* если файл существует */
assert(files(F_N),db),
menu. /* вызываем меню */
start(_):-
write("Файл не найден, попробуйте еще раз"),nl,
readln(F_N1),
start(F_N1).
GOAL /* раздел внутренней цели*/
write("Input file name"),nl,
readln(F_N),
start(F_N).



TURBO PROLOG 2.0

Автор: russya 25.12.2014, 14:23
Спасибо большое за программу! а может есть еще ПЗ к ней?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)