Enunciado: Implementação em Lisp/Racket
Este documento detalha as tarefas a serem implementadas no paradigma Funcional.
Estrutura de Dados
O arquivo de dados dataset.lsp define listas de structs. Assuma as seguintes estruturas:
(struct filme (id titulo genero diretor ano classificacao duracao) #:transparent)
(struct usuario (id nome idade) #:transparent)
(struct avaliacao (uid fid nota) #:transparent)E as listas globais: * filmes: Lista de (filme ...) * usuarios: Lista de (usuario ...) * avaliacoes: Lista de (avaliacao ...)
Fase 1: Funções Básicas e Filtros
Use filter, map e lambdas.
1.1 filmes-por-genero
- Assinatura:
(filmes-por-genero genero lista-filmes) - Retorno: Lista de structs filme. Exemplo:
> (filmes-por-genero "Acao" filmes)
(list (filme 1 "Mad Max" ... ) (filme 3 "Duro de Matar" ...))1.2 filmes-ano-superior
- Assinatura:
(filmes-ano-superior ano lista-filmes) - Retorno: Filtra filmes com ano estritamente maior que o parametro.
1.3 notas-do-usuario
- Assinatura:
(notas-do-usuario uid lista-avaliacoes) - Retorno: Lista simples de inteiros (apenas as notas). Exemplo:
> (notas-do-usuario 1 avaliacoes)
'(5 4 5)Fase 2: Redução e Agregação
Use foldl, apply ou recursão.
2.1 media-avaliacoes
- Assinatura:
(media-avaliacoes uid lista-avaliacoes) - Lógica: Se lista vazia, retorna 0. Senão, divide soma pelo total.
2.2 usuario-hater?
- Assinatura:
(usuario-hater? uid lista-avaliacoes) - Retorno:
#tse quantidade de notas 1 > quantidade de notas 5.
Fase 3: Pipeline Colaborativo
Construa o fluxo de recomendação.
3.1 Funções Auxiliares
Recomenda-se criar: * (get-filme-id fid lista-filmes): Retorna struct filme pelo ID. * (filmes-que-gostou uid lista-avaliacoes): Retorna lista de filmes que o usuário deu nota \(\ge 4\).
3.2 recomendar
- Assinatura:
(recomendar uid lista-avaliacoes lista-filmes) - Lógica:
- Encontrar usuários Vizinhos (que gostaram de pelo menos 1 filme que
uidtambém gostou). - Coletar filmes que Vizinhos gostaram (\(\ge 4\)).
- Remover filmes que
uidjá avaliou. - Remover filmes de Diretores “Odiados” (que
uiddeu nota 1 alguma vez). - Filtrar pela variação da Matrícula (Idade/Tempo/Ano). Exemplo:
- Encontrar usuários Vizinhos (que gostaram de pelo menos 1 filme que
> (map filme-titulo (recomendar 1 avaliacoes filmes))
'("O Poderoso Chefão" "Pulp Fiction")