Prolog - Ler de ficheiros
Thursday, May 6, 2010 6:09:51 PM
Existem duas formas de ler de ficheiros com o Prolog
- See
- Open
a)
A forma mais simples de ler de um ficheiro é se este contiver predicados prolog.
Por exemplo:
'familia.pl'
filha(ana). mae(beatriz). pai(carlos). mae_de(beatriz,ana). pai_de(carlos,ana).
Portanto para ler este ficheiro familia.pl, podem usar o seguinte código:
'ler.pl'
ler(Filename) :- see(Filename), repeat, read(Q), file_to_list(Q,L), seen, print(L). file_to_list(end_of_file,[]). file_to_list(Q,[Q|L]) :- read(N), file_to_list(N,L).
Como o read/1 lê sempre o próximo predicado podem ir construindo a lista de predicados muito facilmente.
Assim ao fazer a consulta:
?- ler('familia.pl').
[ filha(ana), mae(beatriz), pai(carlos), mae_de(beatriz,ana), pai_de(carlos,ana) ]
yes
b)
Se o ficheiro se encontrar no seguinte formato:
'quadradomagico.txt'
2 7 6 9 5 1 4 3 8
Para este caso já não é possivel usar a função "seen" dado que não são predicados.
Já será necessário usar o open/3 e trabalhar com "Streams".
Para ler o 'quadradomagico.txt' podemos fazer da seguinte forma:
'ler.pl'
ler_txt(Filename) :- open(Filename,read,OS), get_char(OS,C), txt_to_list(C,L,OS), close(OS), print(L).
txt_to_list(_,[],OS) :- at_end_of_stream(OS).
txt_to_list(' ',L,OS) :- get_char(OS,Q), txt_to_list(Q,L,OS).
txt_to_list('\n',L,OS) :- get_char(OS,Q), txt_to_list(Q,L,OS).
txt_to_list(C,[C|L],OS) :- get_char(OS,Q), txt_to_list(Q,L,OS).
Assim:
?- ler_txt('quadradomagico.txt').
[2,7,6,9,5,1,4,3]
yes
Se tiverem alguma dúvida estarei ao vosso dispor.
Ficheiros usados neste post
familia.pl
ler.pl
quadradomagico.txt
