Carregando programas, editando programas

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

Os predicados padrão do Prolog para carregar programas são 'consult', 'reconsult' e a notação do carregador de colchetes '[...]'. Por exemplo, o objetivo ?- consult('lists.pro'). abre o arquivo lists.pro e carrega as cláusulas desse arquivo na memória.

Existem duas maneiras principais em que um programa Prolog pode ser deficiente: ou o código-fonte tem erros de sintaxe, caso em que haverá mensagens de erro ao carregar, ou então há um erro lógico de algum tipo no programa, que o programador descobre testando o programa.

A versão atual de um programa Prolog é geralmente considerada como um protótipo para a versão correta no futuro e é uma prática comum editar a versão atual, recarregá-la e testá-la novamente. Essa abordagem de prototipagem rápida funciona bem, desde que o programador tenha dedicado tempo e esforço suficientes para analisar o problema em questão. Curiosamente, se a abordagem de prototipagem rápida parece estar falhando, este é um excelente momento para pegar papel e lápis, repensar os requisitos e começar de novo!

Poderíamos chamar nosso editor por dentro do prolog...

?- edit('lists.pro'). %% User defined edit, see below ...

... e, em seguida, ao retornar do editor (e presumindo que a nova versão do arquivo foi salva novamente usando o mesmo nome de arquivo), pode-se usar o objetivo...

? reconsult('lists.pro').

... para recarregar as cláusulas do programa na memória, substituindo automaticamente as definições antigas. Se alguém tivesse usado 'consultar' ao invés de 'consultar novamente', as cláusulas antigas (e possivelmente incorretas) teriam permanecido na memória junto com as novas (... isso depende do sistema Prolog, na verdade).


Se vários arquivos foram carregados na memória e um precisa ser recarregado, use 'reconsultar'. Se o arquivo recarregado definir predicados que não estão definidos nos arquivos restantes, o recarregamento não perturbará as cláusulas que foram originalmente carregadas dos outros arquivos.

A notação de colchetes é muito útil. Por exemplo, ?- ['file1.pro',file2.pro',file3.pro']. carregaria (efetivamente consultaria novamente) todos os três arquivos na memória do Prolog.

Many prolog systems rely upon the programmer to hava a favorite text editor for editing prolog programs. Here is a sample prolog program which calls TextEdit on the Mac(OSX). (This is just an illustration; we do not use TextEdit routinely for writing prolog programs.) Muitos sistemas de Prolog que o programador tenha um editor de texto favorito para editar programas Prolog. Segue um exemplo usando o 'TextEdit' no Mac (OSX). (Esta é apenas uma ilustração; não usamos o TextEdit normalmente para escrever programas Prolog.)

edit(File) :- 
   name(File,FileString), 
   name('open -e ', TextEditString), %% Edit this line for your favorite editor
   append(TextEditString,FileString,EDIT),
   name(E,EDIT), 
   shell(E).

Para usar este editor, seu código-fonte deve ser carregado (suponha que seja local para a sessão do prólogo) ...

?- [edit].

yes

e então, use do objetivo 'edit' (novamente suponha que o arquivo a ser editado seja local para a sessão do Prolog) ...

?- edit('p.pl').

{ TextEdit starts up with file loaded. Edit the program... Save the program using the same filename ...}
Fig. 2.4.1 Chamando o editor externo

Depois de editar e salvar o programa Prolog, podemos consultar novamente a nova versão na sessão do Prolog ...

?- reconsult('p.pl').

{ Our prolog session reloads the program for further testing ...}

É possível modificar o pequeno programa em edição para se adequar às circunstâncias particulares do usuário (vários Prologs, vários sistemas operacionais, vários editores).

Para carregar cláusulas fornecidas interativamente pelo usuário, use os objetivos

?-consult(user).
?-reconsult(user).
?-[user].

O usuário então digita as cláusulas interativamente, usando stop '.' no final das cláusulas e ^ Z para encerrar a entrada.


Exercício 2.4 Experimente o programa de edição. Primeiro, tente objetivos ...

?-name('name',NameString).

... e...

?- name(Name,"name").

name/2 é descrito em Section 4.13


Agora é um bom momento para o leitor pular e dar uma primeira leitura às duas primeiras seções do 'Capítulo 3 Como o Prolog Funciona', e depois retornar para ler sobre outros exemplos de programas. Será necessário entender como funciona a máquina de inferência Prolog para entender a construção de muitos programas Prolog.

Veja Também