Trabalho I: Tabulação em Linguagens Lógicas

Objectivo

Permitir que os alunos adquiram uma maior sensibilidade e conhecimento prático do funcionamento da técnica de tabulação aplicada à linguagem de programação lógica Prolog.

Descrição

A tabulação é uma das mais bem sucedidas técnicas de implementação que resolve a incapacidade dos sistemas tradicionais de Prolog em lidarem com computações redundantes e ciclos infinitos. A ideia básica da tabulação é guardar as soluções das computações intermédias de modo a que estas possam ser re-utilizadas quando aparecem chamadas repetidas a subgolos tabelados. As estratégias de tabulação dividem-se em duas categorias principais: a tabulação com espera e a tabulação linear. Para assegurar que todas as soluções são correctamente encontradas, a tabulação com espera utiliza um mecanismo de suspensão no qual preserva o estado das sub-computações correspondentes a subgolos tabelados. A tabulação linear usa a simples execução em árvore onde os subgolos tabelados são re-executados sucessivamente até a computação atingir o seu ponto-fixo.
A forma mais eficiente de implementar tabulação num sistema Prolog é estender a máquina abstracta de execução. Uma forma mais simples mas menos eficiente de implementar tabulação é conseguida por re-escrita dos programas originais onde se incluem primitivas externas de suporte à execução com tabulação. Essas primitivas podem depois ser implementadas em Prolog e/ou utilizando o interface a outras linguagens disponível nos sistemas Prolog.
Neste trabalho pretende-se que utilize a aproximação baseada na re-escrita de programas com primitivas externas para implementar o suporte à execução com tabulação no sistema Yap Prolog.

Implementação

A aproximação baseada na re-escrita de programas com primitivas externas para implementar tabulação pode dividir-se em duas componentes: a componente que implementa a re-escrita dos programas originais e a componente que implementa o suporte às primitivas externas incluidas pela componente de re-escrita. Na realização deste trabalho implemente apenas a componente de suporte às primitivas externas e considere que os programas já se encontram re-escritos tal como pretendido.
A estratégia a implementar poderá ser uma estratégia de tabulação com espera ou de tabulação linear (consulte a secção Trabalho Relacionado para obter mais detalhes sobre diferentes formas de implementar tabulação). A correcção do desenho do algoritmo de suporte à execução com tabulação será mais valorizada do que a sua eficiência em termos do eventual número de re-computações necessárias para atingir o ponto-fixo.
A representação da tabela deverá ser conseguida por utilização de uma estrutura de dados baseada em tries. Para isso utilize o módulo tries do sistema Yap Prolog através da directiva:
:- use_module(library(tries)).
Alguns exemplos da utilização deste módulo podem ser obtidos aqui.

Programas de Teste

Trabalho Relacionado

O Que Entregar?

Um ficheiro .tar que inclua: O código deve compilar e executar nas máquinas dos laboratórios das aulas práticas. Uma boa estruturação e legibilidade do código será valorizada.

Prazos

O trabalho deve ser entregue via web até às 12 horas do dia 31 de Março de 2008, sendo a sua apresentação feita posteriormente em horário a definir.