Trabalho Prático: 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 será a estratégia de tabulação linear. A correcção do desenho do algoritmo de suporte à execução com tabulação linear 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)).
Exemplos da utilização do módulo das tries e exemplos de programs de teste podem ser obtidos aqui.

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 por email até às 12 horas do dia 24 de Maio de 2013, sendo a sua apresentação feita posteriormente em horário a definir.