Aluno: Lorenzo Gouveia Flosi
Este projeto implementa um mecanismo de busca baseado em Lógica de Primeira Ordem utilizando a linguagem Prolog. A base de conhecimento foi construída a partir do dataset público de Pokémon disponível no Kaggle, contendo estatísticas de todas as gerações 1 a 6.
- Fonte: https://www.kaggle.com/datasets/abcsds/pokemon
- Arquivo original:
Pokemon.csv - Campos selecionados (8 campos):
| Campo | Tipo | Descrição |
|---|---|---|
| Nome | Qualitativo | Nome do Pokémon em minúsculo, sem espaços |
| Tipo1 | Qualitativo | Tipo primário (ex: fire, water, grass) |
| Tipo2 | Qualitativo | Tipo secundário, ou none se não houver |
| HP | Quantitativo | Pontos de vida base |
| Ataque | Quantitativo | Stat de ataque físico base |
| Defesa | Quantitativo | Stat de defesa física base |
| Total | Quantitativo | Soma de todos os stats base |
| Geração | Quantitativo | Geração em que foi introduzido (1 a 6) |
| Lendário | Qualitativo | true se é lendário, false caso contrário |
/
├── Pokemon.csv # Dataset do Kaggle
├── etl_pokemon.py # Script Python para gerar a base Prolog a partir do CSV
├── pokemon_base.pl # Base de conhecimento em Prolog gerada pelo script
└── README.md # Este arquivo
O dataset escolhido foi o Pokemon with stats do Kaggle, que contém estatísticas de todos os Pokémon das gerações 1 a 6. O arquivo original Pokemon.csv possui 800 registros e 13 colunas. Foram selecionadas 8 colunas relevantes, misturando campos qualitativos (nome, tipo, lendário) e quantitativos (HP, ataque, defesa, total, geração).
O script etl_pokemon.py realiza a transformação do CSV em base de conhecimento Prolog. Para cada linha do CSV, o script:
- Lê os campos selecionados
- Normaliza o nome do Pokémon (minúsculo, sem espaços, sem acentos) para respeitar a sintaxe Prolog
- Converte o campo
LegendarydeTrue/Falseparatrue/false - Trata o campo
Type 2vazio como o átomonone - Gera um predicado no formato:
pokemon(bulbasaur, grass, poison, 45, 49, 49, 318, 1, false).Ao final, o script também escreve automaticamente no arquivo as regras Prolog das 3 perguntas, gerando um arquivo .pl completo e pronto para uso.
Com a base de predicados pronta, foram criadas regras para responder às 3 perguntas do projeto. Cada regra utiliza técnicas de agregação e ordenação:
- Pergunta 1: usa
findallpara coletar os ataques de cada tipo,sumlistelengthpara calcular a média, esetof+reversepara ordenar do maior para o menor. - Pergunta 2: calcula a média global de HP com
findall+sumlist+length, depois filtra os lendários cujo HP supera essa média. - Pergunta 3: usa
memberpara iterar sobre as gerações,findallpara contar os Pokémon fortes de cada geração, esetofpara ordenar o ranking.
python etl_pokemon.pyAcesse: https://swish.swi-prolog.org/
- Clique em Create a program "Program" here
- Cole todo o conteúdo do arquivo
pokemon_base.plna área Program - Crie as querys que desejar escrevendo na parte direita da página
Técnica: agregação com findall, soma, divisão e ordenação com setof + reverse.
?- imprimir_ranking_ataque.Saída:
=== PERGUNTA 1: Ranking de Ataque Medio por Tipo Primario ===
1. dragon: 112.13
2. fighting: 96.78
3. ground: 95.75
...
Técnica: dupla agregação — calcula a média global de HP de todos os Pokémon, depois filtra apenas os lendários que superam esse valor.
?- imprimir_lendarios_hp.Saída:
=== PERGUNTA 2: Lendarios com HP acima da Media Geral ===
(Media geral de HP: 69.26)
1. giratinaorigin_forme: HP = 150
2. giratinainaltered_forme: HP = 150
3. yveltal: HP = 126
...
Técnica: contagem por grupo usando findall + length, iteração sobre gerações com member e ordenação com setof.
?- imprimir_geracoes_forca.Saída:
=== PERGUNTA 3: Ranking de Geracoes por Pokemon com Total > 500 ===
1. Geracao 4: 51 Pokemon
2. Geracao 3: 44 Pokemon
3. Geracao 5: 42 Pokemon
...
Para imprimir as 3 perguntas de uma vez, use:
?- imprimir_tudo.
- Dataset: https://www.kaggle.com/datasets/abcsds/pokemon
- Prolog online: https://swish.swi-prolog.org/