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:
-
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.
- 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.