Projeto academico da disciplina de Logica e Matematica Discreta.
O objetivo e construir um motor de conhecimento em Prolog a partir de um dataset publico de jogos. A base responde perguntas por meio de fatos, regras logicas e consultas executaveis, funcionando como um recomendador simbolico baseado em conteudo.
Sistema de recomendacao de jogos usando Prolog.
O projeto utiliza atributos como genero, preco, avaliacao, ano, plataforma, publisher e popularidade para recomendar jogos com base em regras declarativas.
Fonte oficial do dataset:
Tabela-fonte utilizada:
games_march2025_cleaned.csv
Esse arquivo e a unica fonte de dados usada na base de conhecimento.
Fluxo principal:
Dataset CSV bruto
-> limpeza e selecao de campos em Python
-> CSV tratado
-> geracao automatica de fatos Prolog
-> base de conhecimento
-> regras logicas
-> consultas executaveis
projeto/
|-- data/
| |-- raw/
| | `-- games_march2025_cleaned.csv
| `-- processed/
| `-- games_clean.csv
|-- docs/
| |-- arquitetura.md
| |-- dataset.md
| |-- decisoes.md
| `-- perguntas.md
|-- etl/
| |-- clean_dataset.py
| |-- download_dataset.py
| `-- generate_prolog.py
|-- prolog/
| |-- generated/
| | `-- base_conhecimento.pl
| |-- src/
| | |-- queries.pl
| | `-- regras.pl
| `-- main.pl
|-- pyproject.toml
|-- uv.lock
`-- README.md
Arquivo CSV bruto baixado da Kaggle. Ele representa a tabela-fonte unica do projeto e nao deve ser editado manualmente.
CSV tratado pelo ETL. Contem apenas os campos selecionados e padronizados para a geracao da base Prolog.
Baixa o arquivo games_march2025_cleaned.csv para data/raw/.
Le o CSV bruto, seleciona os campos do projeto, trata ausencias, padroniza valores e gera data/processed/games_clean.csv.
Converte o CSV tratado em fatos Prolog e gera prolog/generated/base_conhecimento.pl.
Arquivo gerado automaticamente com os fatos da base.
Exemplo:
nome(app_1145360, 'Hades').
genero(app_1145360, action).
preco(app_1145360, 73.99).
avaliacao(app_1145360, 98).
ano(app_1145360, 2020).
plataforma(app_1145360, windows).
publisher(app_1145360, supergiant_games).
popularidade(app_1145360, 251000).Contem as regras logicas do recomendador, como:
- jogo barato;
- jogo bem avaliado;
- jogo popular;
- recomendado por genero e plataforma;
- melhor jogo de um genero;
- destaque absoluto da base.
Contem consultas executaveis para demonstracao do projeto. Alem das cinco consultas principais, o arquivo inclui uma consulta com ordenacao declarativa usando setof/3.
Ponto de entrada do projeto Prolog. Carrega a base gerada, as regras e as consultas.
Documentacao de apoio:
dataset.md: origem e recorte do dataset;arquitetura.md: organizacao do projeto;decisoes.md: criterios adotados nas regras;perguntas.md: perguntas do trabalho e sua logica.
O projeto trabalha com 9 campos, misturando variaveis qualitativas e quantitativas:
| Campo | Tipo | Uso |
|---|---|---|
game_id |
identificador | chave do jogo na base |
nome |
qualitativo | exibicao |
genero |
qualitativo | preferencia do usuario |
preco |
quantitativo | custo-beneficio |
avaliacao |
quantitativo | qualidade percebida |
ano |
quantitativo | recencia |
plataformas |
qualitativo | compatibilidade |
publisher |
qualitativo | contexto editorial |
popularidade |
quantitativo | relevancia na base |
Sincronize o ambiente com uv:
uv syncBaixe o CSV bruto da Kaggle:
uv run python etl/download_dataset.pyGere o CSV tratado e a base Prolog:
uv run python etl/clean_dataset.py
uv run python etl/generate_prolog.pyCarregue o projeto no SWI-Prolog:
swipl -q -s prolog/main.plSe preferir abrir o interpretador primeiro:
consult('prolog/main.pl').Alguns criterios da base:
jogo_barato/1: preco menor ou igual a20;jogo_preco_intermediario/1: preco entre20e50;jogo_bem_avaliado/1: nota maior ou igual a85;jogo_mal_avaliado/1: nota menor ou igual a50;jogo_popular/1: popularidade maior ou igual a5000;jogo_muito_popular/1: popularidade maior ou igual a50000;jogo_recente/1: ano maior ou igual a2022.
As consultas abaixo podem ser executadas diretamente no prompt do Prolog.
Jogos action para windows recomendados pela base.
Nome da query:
recomendados_action_windows(Lista).Por dentro da query:
findall(Nome, (recomendado_por_genero_e_plataforma(Jogo, action, windows), nome(Jogo, Nome)), Lista).Resultado da query:
Lista = ['Counter-Strike 2', 'Grand Theft Auto V Legacy', 'Team Fortress 2' | ...].Quais jogos possuem bom custo-beneficio.
Nome da query:
recomendados_custo_beneficio(Lista).Por dentro da query:
findall(Nome-Preco-Nota, (recomendado_custo_beneficio(Jogo), nome(Jogo, Nome), preco(Jogo, Preco), avaliacao(Jogo, Nota)), Lista).Resultado da query:
Lista = ['Counter-Strike 2'-0.0-86, 'Grand Theft Auto V Legacy'-0.0-87, 'Team Fortress 2'-0.0-89 | ...].Quais lancamentos promissores existem para windows.
Nome da query:
lancamentos_promissores_windows(Lista).Por dentro da query:
findall(Nome-Ano, (recomendado_lancamento_promissor(Jogo, windows), nome(Jogo, Nome), ano(Jogo, Ano)), Lista).Resultado da query:
Lista = ['Black Myth: Wukong'-2024, 'ELDEN RING'-2022, 'Baldur''s Gate 3'-2023 | ...].Qual e o melhor jogo de rpg segundo os criterios da base.
Nome da query:
melhor_jogo_rpg(Nome, Nota, Popularidade).Por dentro da query:
melhor_do_genero(rpg, Jogo), nome(Jogo, Nome), avaliacao(Jogo, Nota), popularidade(Jogo, Popularidade).Resultado da query:
Nome = 'Persona 4 Golden',
Nota = 97,
Popularidade = 64224.Quais jogos sao destaques absolutos da base.
Nome da query:
destaques_absolutos(Lista).Por dentro da query:
findall(Nome-Nota-Popularidade, (recomendado_destaque(Jogo), nome(Jogo, Nome), avaliacao(Jogo, Nota), popularidade(Jogo, Popularidade)), Lista).Resultado da query:
Lista = ['Terraria'-97-1102434, 'Garry''s Mod'-96-985010, 'Black Myth: Wukong'-96-825621 | ...].Como um jogo especifico se classifica na base.
Nome da query:
classificacoes_black_myth_wukong(Lista).Por dentro da query:
setof(Classificacao, Jogo^(nome(Jogo, 'Black Myth: Wukong'), classificacao_jogo(Jogo, Classificacao)), Lista).Resultado da query:
Lista = [bem_avaliado, destaque, excelente, muito_popular, popular, recente].Qual e o pior jogo de rpg segundo os criterios da base.
Nome da query:
pior_jogo_rpg(Nome, Nota, Popularidade).Por dentro da query:
pior_do_genero(rpg, Jogo), nome(Jogo, Nome), avaliacao(Jogo, Nota), popularidade(Jogo, Popularidade).Resultado da query:
Nome = 'Shallow Space',
Nota = 23,
Popularidade = 181.As consultas acima sao as mesmas documentadas em prolog/src/queries.pl, para facilitar a demonstracao no SWI-Prolog.
- digite
;para pedir mais respostas quando a consulta nao retorna lista pronta; - use
make.para recarregar os arquivos apos alguma alteracao; - use
halt.para sair do interpretador.
O projeto foi estruturado para atender ao trabalho da disciplina:
- uma unica tabela-fonte do dataset publico;
- entre 6 e 10 campos selecionados;
- mistura de atributos qualitativos e quantitativos;
- ETL em Python;
- base gerada automaticamente em Prolog;
- perguntas respondidas com consultas em Prolog;
- regras que vao alem de filtros simples.