Filipe A. Barroso

Blog

Prolog - Ler de ficheiros

,

Este post está pensado para quem usa o SICStus.

Existem duas formas de ler de ficheiros com o Prolog

  1. See
  2. 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

HTML 101

Comments

David Piçarradpicarra Thursday, May 6, 2010 9:06:04 PM

muito bem!

Write a comment

New comments have been disabled for this post.