[Закрыть]
 
popoff.donetsk.ua
Хорошо управляемое предприятие - это спокойное место. Зато фабрика, отличающаяся «кипучей» деятельностью и «трудовым героизмом» работников, который бросается в глаза любому посетителю, является на самом деле плохо управляемой.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Функциональное и логическое программирование - Turbo Prolog - пытаюсь обратить слова в файле и записать в другой

Turbo Prolog - пытаюсь обратить слова в файле и записать в другой

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
Гость Lispy url://forum.message:2859
Turbo Prolog - пытаюсь обратить слова в файле и записать в другой
Lispy

Привет. Спасибо за помощь в предыдущем посте. Наконец стал ближе к цели.
Я делаю программу на прологе которая должна считывать текст из файла затем каждое слово обращать (те переворачивать шиворот на выворот :))
а затем результат записывать в другой файл. Как не странно у меня получились все основные процедуры: и из файла строку читает, и буквы в каждом слове переставляет и обратно в нормальном виде выводит. Но... Но кудаже без проблем.
Все вроде бы как надо вот только не пойму как это дело зациклить. К примеру получается считать строку из файла перевернуть каждое слово а вот обратно в другой файл записываться не хочет :( Компилятор молчит, файл для вывода создается а вот вывода в него нет. Вроде бы и открываю файл и закрываю и вывод в файл перенаправляю а он все равно пустой.
В чем проблема?.
Второе что мне непонятно почему я не могу считать файл до конца? Т.е во всех учебниках написано что ... при считывании изменяется позиция курсора и при следующем обращении считывание продолжается из той позиции на которой было завершено считывание. Я пробовал сделать рекурсию но каждый раз считывается только одна строка.
Вот мой код получился вот такой:

domains            //тут все вроде бы понятно поэтому без комментариев
file=f
st,Y=string
charlist=char*

predicates
readlist(string,charlist) //для превращения строки в список в данном случае в качестве строки используется каждое слово
razbor(string)     //здесь просиходит разбор строки на слова, с последующим забиванием каждого слова в список для обращения
append(charlist,charlist,charlist) //вспомогательное - для переворота слов
revers(charlist,charlist)    //собственно для обращения списка
formword(charlist) //для форматрирования вывода списка как слова - т.е без символов
readfile(string) //считывает строку из файла

clauses

razbor(STR):-openwrite(f,"RESULT"), //собственно разбор строки на слова с последующим переворотом и выводом в файл
fronttoken(STR,Y,Z),
readlist(Y,Temp),
revers(Temp,Rev), //обращенный список Rev передается в  formword
formword(Rev),write(" "),
closefile(f),
razbor(Z). //рекурсивный вызов который работает до конца строки



readfile(F):-openread(f,F), //считываем строку из файла
readdevice(f),
readln(S),
closefile(f),
razbor(S). //закрываем и начинаем разбирать


readlist("",[]). //здесь каждое слово забивается в список
readlist(S,[H|T]):-frontchar(S,H,S1),
readlist(S1,T).

append([],L,L).
append([N|L1],L2,[N|L3]):-append(L1,L2,L3).

revers([],[]). //а здесь список переворачивается
revers([X|L1],L2):-revers(L1,L3),
append(L3,[X],L2).

formword([]). //а тут форматируется вывод списка без знаков
formword([H|T]):-write(H),formword(T).

goal
write("Enter file name: "), //вводим имя файла
readln(F), //считываем его в переменную
readfile(F).//запускаем процесс


Вот так. Помогите пожалуйста отшлифовать до нормальной работы.

Гость Lyspi url://forum.message:2860
Lyspi

Вот нашел в чем причина. Дело в бесконечной рекурсии переделал

razbor(STR):-STR="".
razbor(STR):-
fronttoken(STR,Y,Z),
readlist(Y,Temp),
revers(Temp,Rev),
formword(Rev),write(" "),
razbor(Z),nl,
readfile.

Я использовал razbor(STR):-STR= чтоб остановить рекурсию когда строка станет пуста но это увы не всегда работает. Т.е работает при идеальных условиях которые увы не всегда идеальны. Как лучше сделать? Чтоб работало наверняка.

popoff
Yuri
Июл, 2004
Сообщений: 940
popoff url://forum.message:2861

Попробуйте так вместо первого утрвеждения:

razbor(""):-!.
________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Гость Lispy url://forum.message:2862
Lispy

Да попробовал. -Нет проблема осталась. Попробовал вот так
razbor(STR):-str_len(STR,Len),Len=0,!.
Так стало читать побольше но обнаружил что причина в переполнении стека. Как это можно решить? Есть ли способ както все очищать чтоли?

Гость Lispy url://forum.message:2863
Lispy

Все еще не могу побороть переполнение. Вчера весь день убил. Самое интересное что на разных текстах переполнение может возникать либо рано либо поздно т.е как бы не зависит от длинны текста чтоли?
Как же это побороть? Можно ли както считывать текст из файла не по строкам а по словам? Есть ли какие нибудь функции на этот счет?
Помогите пожалуйста.

Гость kkvip2000 at rambler dot ru url://forum.message:3017
kkvip2000 at rambler dot ru

Все вроде бы как надо вот только не пойму как это дело зациклить. К примеру получается считать строку из файла перевернуть каждое слово а вот обратно в другой файл записываться не хочет :( Компилятор молчит, файл для вывода создается а вот вывода в него нет. Вроде бы и открываю файл и закрываю и вывод в файл перенаправляю а он все равно пустой.
В чем проблема?.

Ты не перенаправляешь вывод. Нужно писать так:
writefile(F,S)penwrite(f,F),
writedevice(f),
writeln(S),
closefile(f).



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

Ты считываешь строку и тут же закрываешь файл.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Обмен электронных валют
money.dn.ua