MC336 - Programação Funcional

Criada: 2007-08-01
Modificada: 2007-09-29
Modificada: 2007-10-08

A linguagem escolhida para esta seção do curso é Lisp.

Usaremos a implementação CLISP ou CMUCL. Ambas são igualmente adequadas para os propósitos da disciplina. Para o jogo (veja abaixo detalhes sobre ele) daremos preferência a CLISP.

Manual online do padrão Common Lisp. Se estiver fora do ar, tente este.

Livro interessante: Practical Common Lisp, de Paul Seibel, Apress, 2005. Texto integral na Internet. Infelizmente, não tem exercícios.

Quase cem exercícios Lisp. Em construção.

O jogo a ser implementado neste semestre será o Bloxorz.

A codificação de um jogo em Lisp será através de uma lista (T (X Y)), onde T é uma lista contendo as posições existentes, cada uma delas sendo uma lista de dois números inteiros, e X, Y são as coordenadas do buraco. A posição inicial do bloco é sempre (0,0). Tanto a casa inicial quanto a final devem estar no tabuleiro, e devem ser distintas. Não importa a ordem das casas em T.

Por exemplo, ( ((0 1) (0 0) (0 2) (1 0) (1 1) (1 2)) (1 0)) é um jogo válido.

Uma solução é codificada como uma lista de átomos :N, :S, :L, :O, significando um movimento em direção ao norte, sul, leste ou oeste, respectivamente. Observe que os movimentos são keywords, para evitar problemas de igualdade entre átomos de pacotes distintos. A convenção a ser seguida é: norte significa incremento na coordenada Y; sul significa decremento em Y; leste é incremento em X; e oeste, decremento em X. A solução deve conduzir da posição inicial ao buraco, de acordo com os movimentos do bloco, que começa em pé na posição inicial e deve chegar em pé ao buraco, sem cair para fora do tabuleiro antes disso.

Por exemplo, (:N :L :S) é uma solução válida para o jogo acima.

Cada aluno deverá implementar um pacote (package) que contenha as funções bolar e resolver. A função bolar não recebe nenhum argumento e retorna uma lista com dois elementos: um jogo codificado como acima, e uma solução, A função resolver recebe um jogo e retorna uma solução para ele.

Os jogos não poderão ter mais do que 1000 casas.

Para implementar um pacote, basta colocar logo no início do programa linhas da forma:

(cl:defpackage "RANNNNNN-VERSAO"(:use "COMMON-LISP"))
(in-package "RANNNNNN-VERSAO")

onde RANNNNNN é o seu RA, e VERSAO é a versão, ou seja, um sufixo que permita a você ter vários jogadores diferentes nas fases de aquecimento e treino. O nome do arquivo contendo o jogador deve ser igual ao nome do pacote seguido da extensão .lisp, ignorando-se diferenças entre maiúsculas e minúsculas. Por exemplo, raNNNNNN-versao.lisp, é um nome válido para o arquivo do pacote acima.

Até o dia da prova é obrigatório entregar pelo menos um jogador que não cometa erros. Depois disso haverá mais tempo para aperfeicoá-lo.

Acesso à arena dos jogos.


MC336 Home

© 2007 João Meidanis