Programação
Observações:
• Quando qualquer um dos parâmetros for inválido, as funções devem prever este fato e retornar nil, ou uma mensagem de erro, ou algo semelhante.
• Se quiser, você pode incluir mais alguns parâmetros nas funções pedidas, além dos especificados. Mas use um pouco de bom senso.
• Se já existir na implementação do LISP uma função que faça a mesma coisa (ou quase a mesma coisa) que alguma das funções pedidas, é claro que você NÃO deverá usá-la, mas sim escrever a SUA PRÓPRIA VERSÃO.
• Envie um e-mail para mim com seu(s) nome(s) completo(s) e um arquivo-texto anexado à mensagem contendo código em LISP do trabalho até 23-11-04.
(Impreterivelmente)
1. Manipulação de lats
Uma lat é uma lista de átomos. Exemplo: ( tomate alface cebola cenoura ). Implemente um pacote de funções recursivas para manipulação de lats que inclua as seguintes funções:
• (checklat l), que retorna t se l é uma lat, ou nil caso contrário.
• (removeall a lat), que remove todas as ocorrências do átomo a em lat
• (insertleft new old lat), que insere o átomo new à esquerda de todas as ocorrências do átomo old em lat
• (substall new old lat), que substitui todas as ocorrências do átomo old em lat pelo átomo new
• (occur a lat), que conta todas as ocorrências do átomo a em lat
2. Manipulação de conjuntos
Um conjunto é uma lat (veja a definição de lat no Item 1) onde nenhum elemento ocorre mais de uma vez. Exemplo: ( cenoura batata repolho ) é um conjunto, mas ( cenoura batata batata repolho ) e ( cenoura ( batata ) repolho ) não são. Implemente um pacote de funções recursivas para manipulação de conjuntos que inclua as seguintes funções:
• (testset l), que devolve t se a lista l é um conjunto, ou nil caso contrário
• (makeset l), que constrói um conjunto formado com os átomos que ocorrem na lista l.
Exemplo: se l é a lista ( kiwi kiwi ( laranja ( banana kiwi kiwi ) ) ), então a chamada
(makeset l)