Aluno: Gabriel Chaves Aguiar
Projeto realizado para a disciplina de Matemática Discreta, ministrada pelo professor Raul Ikeda. O objetivo é criar um motor de inferência utilizando a linguagem de programação Prolog, utilizando um dataset de episódios de Naruto.
python python/generate.pyIsso irá gerar o arquivo:
prolog/episodes.pl
swipl?- working_directory(_, 'seu-caminho/Knowledge-Engine').?- consult('prolog/episodes.pl').
?- consult('prolog/queries.pl').?- high_rated(Title, Rate).Resultado:
T = 'Homecoming',
R = 8.2
Ao executar a query, retorna o título de um episódio e sua nota (se ela for maior que 8). Para obter mais resultados, basta pressionar ; no terminal.
?- best_episode(Title, Rate).Resultado:
Title = 'Homecoming',
Rate = 8.2
?- sagas_avg(List).Resultado:
List = ['s1 Kazekage Rescue'-7.9875, 's10 The Gathering of the Five Kage'-7.736000000000001, 's11 Paradise On The Ship'-5.876190476190477, 's12 Nine-Tailed Fox Taming And Karmic Encounters'-7.612121212121212, 's13 The Seven Shinobi Swordsmen'-6.8549999999999995, 's14 The Fourth Great Ninja War - Assailants From Afar'-6.699999999999999, 's15 The Fourth Great Ninja War - Sasuke And Itachi'-8.178571428571429, 's16 Kakashi: Shadow Of The Anbu Black Ops'-7.553846153846153, … - …|…].
➡ Pergunta 2: Dentre os episódios com nota acima de oito, quais são os que tiveram um maior número de votos?
?- best_high_rated_votes(Title, Votes).Resultado:
Title = 'Naruto and Sasuke',
Votes = 2780.
- filtra episódios com nota maior que 8
- compara o número de votos
- retorna o episódio mais popular entre os melhor avaliados
Obs: Esse resultado pode causar uma interpretação errada dos dados. Nesse caso estamos medindo quantitativamente a quantidade de eps com nota acima de oito, então uma saga de nota regular, mas com muitos episódios facilmente ficaria em primeiro, enquanto uma saga com notas altíssimas, mas curta, poderia ser prejudicada.
?- best_saga_high_rated(Saga, Count).Resultado:
Saga = 's20 Infinite Tsukuyomi: The Invocation',
Count = 27.
- utiliza um predicado auxiliar (
high_rated_episode) - conta quantos episódios de cada saga têm nota > 8
- retorna a saga com maior quantidade
➡ Pergunta 4: Qual foi a melhor saga em geral? (Média de notas dos episódios e quantidade de eps com nota acima de 8 )
Obs: Aplicando a média, podemos ver de forma mais justa qual é realmente o maior arco, mas, usando a quantidade de eps com nota acima de 8 como cofator para o resultado, novamente podemos enviesar a interpretação.
?- best_saga_overall(Saga, Avg, HighCount).Resultado:
Saga = 's17 The Fourth Great Ninja War - The Return Of Squad Seven',
Avg = 8.518181818181818,
HighCount = 11.
Esta query:
- utiliza composição de regras (avg_rating_saga + high_rated_count_by_saga)
- combina média de notas com quantidade de episódios acima de 8
- usa comparação com max_member
?- sagas_stats_list(List).Resultado:
List = [7.98-15-'s1 Kazekage Rescue', ...].
-
Retorna uma lista no formato: Média - Quantidade - Saga
-
Pode ser usada para análise geral ou debug
- Python → ETL (extração e conversão do CSV para Prolog)
- SWI-Prolog → base de conhecimento e inferência lógica
- https://www.swi-prolog.org/
- https://stackoverflow.com/questions/63424113/proper-definition-of-atom-in-prolog-and-logic-programming
| ID | Num_episode | Title | Type | Year_launch | Rate | Votes | Saga | Airdate |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | Homecoming | Mixed Canon/Filler | 2007 | 8.2 | 728 | s1 Kazekage Rescue | 2007-02-15 |
| 2 | 2 | The Akatsuki Makes Its Move | Mixed Canon/Filler | 2007 | 8 | 575 | s1 Kazekage Rescue | 2007-02-15 |
| 3 | 3 | The Results of Training | Mixed Canon/Filler | 2007 | 8 | 508 | s1 Kazekage Rescue | 2007-02-22 |
| 4 | 4 | The Jinchuriki of the Sand | Mixed Canon/Filler | 2007 | 8.2 | 517 | s1 Kazekage Rescue | 2007-03-01 |
O dataset original não possui a tabela "ID", e sim uma tabela vazia, podendo ser interpretada como o ID
Formato de cada elemento em Prolog:
episode(1, 1, 'Homecoming', 'Mixed Canon/Filler', 2007, 8.2, 728, 's1 Kazekage Rescue', '2007-02-15').