110 likes | 234 Views
Princípios da Programação em Prolog. princípios gerais da programação Os critérios usualmente adoptados para avaliar a qualidade de um programa incluem a verificar as seguintes propriedades: Correcção Um programa deve fazer o que é suposto fazer . Eficiência
E N D
Princípios da Programação em Prolog • princípios gerais da programação Os critérios usualmente adoptados para avaliar a qualidade de um programa incluem a verificar as seguintes propriedades: • Correcção Um programa deve fazer o que é suposto fazer. • Eficiência Um programa deve minimizar o tempo de execução e o espaço em memória. • Legibilidade/Transparência Um programa deve ser legível e fácil de interpretar. • Robustez A introdução de dados incorrectos ou inesperados deve ser prevista pelo programa. A ocorrência destes erros deve ser notificada e não deve interromper a execução do programa. • Documentação Um programa deve estar devidamente documentado (o texto do programa e os comentários constituem a documentação mínima associada ao programa).
Princípios da Programação em Prolog • A importância destes critérios depende do problema, das circunstâncias em que o programa é escrito e do contexto onde é suposto ser utilizado. No entanto, a correcção é, sem dúvida, o critério mais importante. • Como escrever programas que satisfaçam algumas (as mais importantes num determinado contexto) ou, preferencialmente, todas estas propriedades? • interpretar/raciocinar (linguagem de especificação) • codificar (linguagem de programação) • Devemos, primeiro, interpretar o problema, desenvolver e analisar (numa linguagem de especificação) soluções e, após ser definida a "melhor" solução, devemos passar à codificação (numa linguagem de programação).
Princípios da Programação em PrologRefinamento gradual • refinamento gradual Para transformar (gradualmente) a especificação (e.g. na linguagem natural ou numa linguagem de especificação) de um problema num programa codificado numa linguagem de programação, é usual utilizar o Refinamento Gradual (Top-Down), i.e. um programa é obtido após uma sequência de transformações (ou refinamentos) – aplicadas tanto às definições dos procedimentos como às estruturas de dados equivalentes que traduzem um aumento de detalhe no sentido da aproximação à linguagem de programação. • Vantagens • Permite a formulação de rascunhos de soluções em termos do que é mais relevante para a resolução do problema. • Cada solução é sucinta, simples e correcta. • Cada refinamento representa um pequeno passo na resolução do problema; o refinamento de uma solução correcta gera uma (nova) solução num nível mais detalhado, i.e. menos abstracto.
metodologia de programação na P.L. • No caso da programação em lógica o refinamento incide sobre a definição das relações que constituem o programa. Se a natureza do problema sugere uma aproximação algorítmica, então deve ser aplicado um refinamento gradual algorítmico, adoptando a perspectiva procedimental do PROLOG. • O processo de desenvolvimento de uma solução para um problema consiste em decompor o problema em (sub) problemas mais simples (i.e. de menor complexidade). • Como encontrar os subproblemas mais adequados? • Recursividade Dividir o problema em casos pertencentes aos dois grupos seguintes: • trivial ou casos limite; • casos gerais onde a solução é construída a partir de versões mais simples do problema original.
Uma razão pela qual a recursividade é aplicada à definição de relações no PROLOG tem a ver com a natureza da estrutura recursiva dos dados. • generalização • É conveniente generalizar o problema original, sendo assim, possível construir uma solução recursiva mais abrangente. Portanto, a solução para o problema original é um caso particular de um problema mais geral. • A generalização de uma relação tipicamente envolve um aumento do seu número de argumentos. Este processo é acompanhado de um aprofundamento do problema de forma a conseguir obter a generalização mais adequada.
Representações Gráficas • Quando desenvolvemos uma solução para um problema é usual recorrer a representações gráficas para ajudar a identificar as relações essenciais entre os objectos. • Vantagens • O PROLOG é particularmente adequado para problemas que envolvam relações entre objectos. Os grafos, onde os nós representam os objectos e os arcos as relações entre os objectos, são particularmente apropriados para a representação dos problemas. • As estruturas de dados em PROLOG são representadas por árvores. • A natureza declarativa do PROLOG facilita a tradução da representação gráfica para o PROLOG.
convenções estilísticas • Regras estilísticas • O corpo de uma cláusula de programa não deve ter muitos literais. • Os procedimentos não devem conter muitas cláusulas. • Os nomes utilizados para os procedimentos e variáveis devem indicar o significado das relações e a adequação das estruturas de dados. • Devem ser utilizados espaços, linhas em branco e indentação. As cláusulas que pertencem a um procedimento devem estar agrupadas: cada cláusula e cada literal do corpo da cláusula devem estar numa linha separada. Cada procedimento deve ser separado por uma linha em branco. • Os cortes e procedimento not devem ser utilizados com prudência. • A modificação do programa com os procedimentos pré-definidos assert e retract deve ser cautelosa. • A utilização do ponto e vírgula diminui a transparência do programa. A legibilidade, neste caso, é aumentada dividindo a cláusula. • Vantagens • Reduzir os erros de programação. • Produzir programas que sejam mais legíveis, fáceis de interpretar, testar e modificar.
Comentários nos programas • Em geral a seguinte informação deve ser incluída nos comentários dos programas: • o que é que o programa faz (objectivo do programa), • como deve ser utilizado (e.g. qual o objectivo a ser introduzido para iniciar a execução do programa e os resultados esperados após a sua execução (possivelmente parcial)); • como estão representados os principais objectos; • o tempo de execução e a memória exigidos pelo programa; • quais as limitações do programa; • qual o significado de cada predicado; quais são os seus argumentos (identificando os de input e os de output);
debugging • debugging- Implementação, nas linguagens de programação, de um conjunto de procedimentos que auxiliam o programador a detectar nos programas (ou em partes (módulos) dos programas) a ocorrência de erros, durante a execução dos programas. • Geralmente estes procedimentos acompanham o desenvolvimento da computação desde o seu início e permitem suspender a execução sempre que desejado (possivelmente para verificar, por exemplo, se os resultados da computação são diferentes dos esperados naquele ponto do programa). • Em consequência da adopção generalizada da técnica bottom-up para a construção de uma implementação para um programa, é natural que a técnica de debugging seja utilizada, primeiro, no teste de pequenas partes do programa e, depois, em partes gradualmente maiores (ou eventualmente no programa completo) tendo, previamente a garantia de que as partes mais pequenas estão isentas de erros.
debugging em PROLOG • No PROLOG a técnica (designada por tracing) que suporta o debugging fornece a visualização gradual (passo a passo) do progresso (comportamento relacionado com a satisfação dos objectivos) do programa durante a sua execução. • Existem alguns procedimentos pré-definidos (depende da implementação do PROLOG) para o debugging tais como: • trace (notrace) Activa (Desactiva) a visualização do comportamento do programa para os objectivos que se seguem. • spy(P) (nospy(P)) Activa (Desactiva) a visualização do comportamento do predicado P para os objectivos que se seguem.
optimização dos programas PROLOG • Para optimizar a eficiência (tempo/memória) da execução de um programa em PROLOG é necessário estudar os aspectos da sua interpretação procedimental (capítulo 3 (Interpretação Procedimental) dos Fundamentos da Programação em lógica). • Alguns aspectos da interpretação procedimental de um programa PROLOG estão directamente relacionados com formas de optimização, que são usualmente utilizadas no desenvolvimento dos programas, tais como: • alterar a ordem dos procedimentos no programa; • alterar a ordem das cláusulas nos procedimentos; • utilizar a técnica do corte; • adicionar ao programa, através das variantes do procedimento assert, resultados que, posteriormente, optimizam o programa para outros objectivos; • (optimização baseada na representação dos objectos) definir estruturas de dados mais adequadas para representar os objectos.