I/O Simples em Prolog

De Augusto Baffa Wiki
Ir para navegação Ir para pesquisar

Prolog usa os seguintes predicados para ler dados

                       seeing(File) 
                       see(File) 
                       read(Data) 
                       seen

File='user' selecionará o teclado como fonte de entrada. Caso contrário, Arquivo deve ser o nome de um arquivo de disco existente (junto com uma designação de caminho, se necessário). Por exemplo, aqui está um pequeno programa para ler dados de um arquivo e imprimi-los na tela.

 
browse(File) :- 
          seeing(Old),      /* save for later */ 
          see(File),        /* open this file */ 
          repeat, 
          read(Data),       /* read from File */ 
          process(Data),    
          seen,             /* close File */ 
          see(Old),         /*  previous read source */ 
          !.                /* stop now */ 
 
process(end-of-file) :- !. 
process(Data) :-  write(Data), nl, fail.

Por exemplo, para inspecionar o arquivo de origem para 'browse' (assumindo que seu nome seja browse.pro), pode-se emitir o objetivo

?- browse('browse.pro').

Na verdade, quando Prolog satisfaz 'seeing(Old)', a variável Old será vinculada à porta (stream ou buffer) da qual a entrada de leitura está vindo atualmente. E quando Prolog satisfaz 'see(File)', o arquivo cujo nome está vinculado como valor a 'File' é aberto e uma porta de leitura ou fluxo é associado ao arquivo. A leitura subsequente é feita por meio desse buffer; e então o objetivo 'seen' fecha o arquivo.

A variável 'Data' no programa deve assumir valores que são termos do Prolog. Por exemplo, o 'Arquivo' pode conter um programa Prolog ou uma seqüência de números. Um arquivo de números teria que ser formatado como na tela a seguir.

              32.2.       /* = real 32.2 */ 
              31.         /* = integer 31 */ 
              4.0.        /* = real 4.0 */

Aqui está uma versão interativa do programa de navegação.

browse :- 
        seeing(Old),      /* save for later */ 
        see(user), 
        write('Enter name of file to browse: '), read(File), 
        see(File),        /* open this file */ 
        repeat, 
        read(Data),       /* read from File */ 
        process(Data),    
        seen,             /* close File */ 
        see(Old)          /*  previous read source */ 
        !.                /* stop now */

Aqui está como usar esta versão, preste atenção à forma que o usuário fornece o nome do arquivo:

 
?- browse. 
Enter name of file to browse: 'foo.pl'. 
...

Prolog usa os seguintes predicados para escrever dados

                       telling(File) 
                       tell(File) 
                       write(Data) 
                       nl 
                       writeln(Data) 
                       told

File='user' selecionará a tela como destino de saída. Por exemplo, aqui está um pequeno programa que salva o programa Prolog atual na memória em um arquivo.

 
my_save(ToFile) :-      
       telling(Old),      /* current write output */ 
       tell(ToFile),      /* open this file */ 
       listing,           /* list all clauses in memory */ 
       told,              /* close ToFile */ 
       tell(Old).         /* resume this output */

Na verdade, quando Prolog satisfaz 'telling(Old)', a variável Old será vinculada à porta associada ao destino de gravação-saída atual. Quando Prolog satisfaz 'tell(ToFile)', o nome do arquivo vinculado a 'ToFile' será aberto (se existir) ou criado e uma porta de saída ou fluxo será associado ao arquivo. A gravação subsequente vai para esse arquivo por meio da porta ou fluxo. Em seguida, satisfazer 'told' fecha o arquivo e a associação da porta ou fluxo com o arquivo.


Exercício 2.10 Projete um programa Prolog que possa abrir e copiar um arquivo de objetos Prolog de um arquivo para outro arquivo.

Nosso último exemplo ilustra uma maneira de carregar um arquivo de termos do Prolog em uma lista. Presume-se que o arquivo contenha apenas termos do Prolog (ou comentários, que são ignorados). Esta é uma maneira prática de converter um arquivo de termos em uma lista de termos (por exemplo, cláusulas Prolog) para processamento posterior. Os operadores no arquivo precisam ser definidos no ambiente Prolog chamando 'file_to_list/2'.

%%
%% Load a file of Prolog terms into a List.
%%
file_to_list(FILE,LIST) :- 
   see(FILE), 
   inquire([],R), % gather terms from file
   reverse(R,LIST),
   seen.

inquire(IN,OUT):-
   read(Data), 
   (Data == end_of_file ->   % done
      OUT = IN 
        ;    % more
      inquire([Data|IN],OUT) ) .

Veja Também