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: #t se 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:
    1. Encontrar usuários Vizinhos (que gostaram de pelo menos 1 filme que uid também gostou).
    2. Coletar filmes que Vizinhos gostaram (\(\ge 4\)).
    3. Remover filmes que uid já avaliou.
    4. Remover filmes de Diretores “Odiados” (que uid deu nota 1 alguma vez).
    5. Filtrar pela variação da Matrícula (Idade/Tempo/Ano). Exemplo:
> (map filme-titulo (recomendar 1 avaliacoes filmes))
'("O Poderoso Chefão" "Pulp Fiction")

Checklist de Entrega

Back to top