%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%     Programma per la lettura da file di sequenze di 
%     termini o caratteri o stringhe
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% leggi_lista_term(L,F): legge dal file F una sequenza di 
% termini (fino a EOF) e li memorizza nella lista L

leggi_lista_term(L,F) :-
      see(F),
      leggi_lista_term(L),
      seen.

leggi_lista_term(L) :-
      read(X),
      leggi_lista_term_cont(X,L).

leggi_lista_term_cont(X,[]) :-
      X == end_of_file.
leggi_lista_term_cont(X,[X|R]) :-
      X \== end_of_file,
      leggi_lista_term(R).

% oppure, in modo piu' sintetico (con uso "cut"):
%
% leggi_lista_term([X|R]) :-
%        read(X),
%        X \== end_of_file,!,
%        leggi_lista_term(R).
% leggi_lista_term([]).

% Goal d'esempio:
%
% Si supponga che il file 'prova.txt' contenga:
% f(a).
% f(b).
%
% ?- leggi_lista_term(L,'prova.txt').
% L = [f(a), f(b)];
% no


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% leggi_lista_car(L,F): legge dal file F una sequenza di 
% caratteri (fino a EOF) e li memorizza nella lista L

leggi_lista_car(L,F) :-
      see(F),
      leggi_lista_car(L),
      seen.

leggi_lista_car([C|R]) :-
      get0(C),
      C \== -1, !,
      leggi_lista_car(R).
leggi_lista_car([]).

% Goal d'esempio:
%
% Si supponga che il file 'prova.txt' contenga:
% ciao.
% come stai?
%
% ?- leggi_lista_car(L,'prova.txt').
% L = L = [99, 105, 97, 111, 46, 10, 99, 111, 109|...] ;
% no


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% leggi_lista_stringa(L,F): legge dal file F una sequenza di 
% stringhe (fino a EOF) e memorizza gli atomi corrispondenti
% nella lista L

leggi_lista_str(L,F) :-
      see(F),
      leggi_lista_str(L),
      seen.

leggi_lista_str([S|R]) :-
      leggi_stringa(S),
      S \== end_of_file, !,
      leggi_lista_str(R).
leggi_lista_str([]).

leggi_stringa(end_of_file) :-
      at_end_of_stream, !.  % vero se si e' raggiunto l'end_of_file 
                            % sul file di input corrente
leggi_stringa(S) :-
      leggi_lista_car2(L),
      name(S,L).

leggi_lista_car2([C|R]) :-
      get0(C),
      C \== 10, C \== 32, C \== -1, !,
      leggi_lista_car2(R).
leggi_lista_car2([]).


% Goal d'esempio:
%
% Si supponga che il file 'prova.txt' contenga:
% parma reggio_emilia
% modena
%
% ?- leggi_lista_str(L,'prova.txt').
% L = [parma, 'reggio emilia', modena] ;
% no

