• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

machi

[Prolog] - Contar linhas de ficheiro

5 mensagens neste tópico

Boa tarde,

já ando há algum tempo a tentar criar um predicado para o fazer mas não estou a conseguir.

Ora bem, pretendo contabilizar o número de linhas de um determinado ficheiro, utilizando prolog.

Haverá alguma dica, sugestão, ajuda que me possa ser dada?  ;)

Cumprimentos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer a coisa recursiva.

Paras quando encontras um fim de ficheiro. Até lá, contas mais uma linha e voltas a invocar a invocar o predicado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho até ao momento isto:

contar_contactos:-see('agendamento.pl'),Numero is 1,ler(Numero),seen.
ler(Valor):-read(X),conta(X,Valor).
conta(end_of_file,_):-!.
conta(X,Numero):- N1 is Numero + 1,ler(N1),conta(X,N1).

Contudo, não está lá muito correcto.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui tá uma versão. Lê letra a letra e incrementa 1 com cada newline. Guarda se o último caractere foi um newline para quando chega ao fim do ficheiro poder acrescentar 1 se a linha não termina com newline.

Se calhar há maneiras de simplificar o meu código, mas não escrevo Prolog há + de 3 nos

csum(end_of_file,false,1,false).
csum(end_of_file,true,0,false).
csum('\n',_,1,true).
csum(_,_,0,false).

contar(LastEOL, Res):- get_char(Char),!,
csum(Char,LastEOL,V,Ret),
(Char==end_of_file, Res is V; 
                   (contar(Ret,SRes),Res is V+SRes)).

doit(FileName,Res):-see(FileName),contar(false,Res),seen.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Problema resolvido:

contar_agendamentos:-see('agendamento.pl'),Numero is 0,ler(Numero),seen.
ler(Valor):-read(X),conta(X,Valor).

conta(end_of_file,Final):-!,write('Total: '),write(Final).
conta(_,Numero):- N1 is Numero + 1,ler(N1).

Após algumas dores de cabeça, lá ficou a funcionar.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora