Concurso/Encontro Nacional de Programação Lógica CeNPL'2003

Universidade de Évora
Évora

9--11 de Maio de 2003


StackGest

Gestor duma Stack de Números

A maioria dos telemóveis tem uma stack que guarda os últimos números chamados (até a um máximo de M). Teoricamente a sua gestão consistira apenas em inserir no topo da stack, o último número chamado. Contudo é preciso atender a 2 constrangimentos:
  1. a stack só pode conter no máximo M números, o que significa que, o inserir mais um número, o mais antigo deve ser eliminado, se a stack estiver cheia.
  2. se o número a inserir já estiver guardado em alguma posição da stack, então passa para o topo, e não se acrescenta nenhum número novo, isto é, a stack não pode conter números repetidos.
Além de tudo isso, em vez do número, deve ser inserida na stack a sigla correspondente, caso exista numa lista telefónica (pessoal) presente.

Tarefa

Escreva um programa Prolog que, sendo dado um novo número telefónico e a stack dos últimos números chamados, e tendo em consideração a lista telefónica existente na base de conhecimento, devolva a stack actualizada.

Os Dados

Os únicos dados do problema são: o novo número a inserir na stack; e a stack actual---ambos argumentos do predicado (a desenvolver) gere/3.
A lista telefónica a usar, para procurar a sigla associada a cada número, terá de ser acrescentada à base de conhecimento na forma de um conjunto de factos correspondentes ao predicado lista/2 cujo 1º argumento é um número de telefone e o 2º argumento é a sigla associada.

Os Resultados

O resultado esperado, nova stack com o número dado à cabeça, será fornecido como 3º argumento do predicado gere/3.

Exemplos

Supondo que a BC contém a lista telefónica:
      lista( 12345, aaa ).
      lista( 23456, bbb ).
      lista( 34567, ccc ).
      lista( 45678, ddd ).
      lista( 56789, eee ).
      lista( 67890, fff ).
seguem-se 4 exemplos de uso do gestor, gere, da stack dos números chamados (em que se supõe que o comprimento máximo é M=4):

      ?- gere( 12345, [bbb], Snova ).
      Snova = [ aaa, bbb ]
      yes

      ?- gere( 12345, [bbb, aaa, 78901], Snova ).
      Snova = [ aaa, bbb, 78901 ]
      yes

      ?- gere( 12345, [bbb, ccc, 78901, ddd], Snova ).
      Snova = [ aaa, bbb, ccc, 78901 ]
      yes

      ?- gere( 45678, [bbb, ccc, 78901, ddd], Snova ).
      Snova = [ ddd, bbb, ccc, 78901 ]
      yes

This document was translated from LATEX by HEVEA.