Reglas para un recomendador

I’m using: SWI-Prolog version 8.1.2
good afternoon, I am a beginner in prologue, I am doing a recommender of movies, music and books. I have a knowledge base.

              
                % Base de conocimeintos
		%Recomendador de:
		% Peliculas
		% Libros
		% Musica


	%Base de conocimientos

        %Libro
  :- discontiguous ltitulo/1.
  :- discontiguous lcategoria/1.
  :- discontiguous lautor/1.
  :- discontiguous lnp/1.
  :- discontiguous lanio/1.
  :- discontiguous lisbn/1.
  :- discontiguous leditorial/1.

     %Pelicula
  :- discontiguous ptitulo/1.
  :- discontiguous pdirector/1.
  :- discontiguous pescritor/1.
  :- discontiguous pproduccion/1.
  :-discontiguous pprotagonistas/1.
  :- discontiguous pgenero/1.
  :- discontiguous pclasificacion/1.
  :- discontiguous pidioma/1.
  :- discontiguous pcalidad/1.
  :- discontiguous panio/1.
  :- discontiguous ppais/1.
  :- discontiguous pduracion/1.

        %Musica
  :- discontiguous mtitulo/1.
  :- discontiguous mgenero/1.
  :- discontiguous mcantante/1.
  :- discontiguous mescritor/1.
  :- discontiguous midioma/1.
  :- discontiguous malbum/1.
  :- discontiguous mproductora/1.
  :- discontiguous mpais/1.


	%Recomendador Pelicula
        %Pelicula(titulo,director,escritor,produccion,
        %genero,clasificacion,idioma,calidad,año,pais,duracion)


ptitulo('Justice League vs the Fatal Five').
pdirector('Sam Liu').
pescritor('Alan Burnett').
pproduccion('Amy McKenna Benjamin Melniker & Michael').
pprotagonistas('Superman Batman Mujer Maravilla').
pgenero('Accion_Aventura_Ciencia ficcion').
pclasificacion('Infantil').
pidioma('Ingles').
pcalidad('HD_Full_HD').
panio(2019).
ppais('EEUU').
pduracion('1_hora_18_minutos').


ptitulo('Bumblebee').
pdirector('Travis Knight').
pescritor('Christina Hodson Kelly Fremon Craig').
pproduccion('Michael Bay_Stephe Davi_Tom DeSanto').
pprotagonistas('Hailee Steinfeld_John Cena_Jorge Lendeborg Jr_Rachel Crow').
pgenero('Accion_Aventura_Ciencia ficcion').
pclasificacion('Infantil').
pidioma('Ingles').
pcalidad('HD_FULL_HD').
panio(2018).
ppais('EEUU').
pduracion('1_hora_45_minutos').


ptitulo('The Lego Movie 2').
pdirector('Mike_Mitchell').
pescritor('Phil Lord_Christopher Miller').
pproduccion('Dan_Lin_Phil_Lord').
pprotagonistas('Chris Pratt_Elizabeth Banks_Tiffany Haddish_Will Arnett_Stephanie Beatriz').
pgenero('Accion_Aventura_Ciencia ficcion').
pclasificacion('Infantil').
pidioma('Ingles').
pcalidad('HD').
panio(2019).
ppais('EEUU').
pduracion('1_hora_47_minutos').

ptitulo('El regreso de Mary Poppins').
pdirector('Rob Marshall').
pescritor('Rob Marshall_John DeLuca').
pproduccion('David Magee').
pprotagonistas('Emily Blunt_Lin Manuel Miranda_Ben Whishaw_Emily Mortimer').
pgenero('Musical_Animacion_Ciencia Ficcion').
pclasificacion('Infantil').
pidioma('Espaniol').
pcalidad('HD_Full_HD').
panio(2018).
ppais('EEUU').
pduracion('2_hora_10_minutos').


ptitulo('Spider Man Into the Spider Verse').
pdirector('Bob Persichetti_Peter Ramsey').
pescritor('Christina Steinberg_Amy Pascal').
pproduccion('Phil Lord_Rodney Rothman').
pprotagonistas('Shameik Moore_Hailee Steinfeld_Mahershala Ali_Jake Johnson_Brian Tyree Henry').
pgenero('Accion_Aventuras').
pclasificacion('Infantil').
pidioma('Espaniol_Ingles').
pcalidad('HD_Full_HD').
panio(2018).
ppais('EEUU').
pduracion('2 horas').

 %Recomendador de libros
   %libro(titulo,categoria,autor,no.pag,isbn,editorial,idioma,año)

ltitulo('El Principito').
lcategoria('Infantil').
lautor('ANTOINE DE SAINT-EXUPERY').
lnp(112).
lanio(2008).
lisbn(9789500426404).
leditorial('EMECE').

ltitulo('LOS CUENTOS DE BEEDLE EL BARDO').
lcategoria('Infantil').
lautor('J K ROWLING').
lnp(160).
lanio(2018).
lisbn(9788498388831).
leditorial('SALAMANDRA').

ltitulo('COMO EXPLICAR FISICA CUANTICA CON UN GATO ZOMBI').
lcategoria('Infantil').
lautor('BIG VAN').
lnp(200).
lanio(2018).
lisbn(9786073175852).
leditorial('ALFAGUARA INFANTIL').

ltitulo('50 COSAS LOQUISIMAS DE LOS ANIMALES').
lcategoria('Infantil').
lautor('TRICIA MARTINEAU WAGNER').
lnp(112).
lanio(2018).
lisbn(9786072120266).
leditorial('LAROUSSE EDICIONES').

ltitulo('ABAJO LOS MUROS').
lcategoria('Infantil').
lautor('ERIC BATTUT').
lnp(32).
lanio(2018).
lisbn(9788417492472).
leditorial('BLUME').

	%Base de conocimiento de musica
	% Musica(Titulo,Genero,Cantante,Escritor,
        % Idioma,Album,Productora,Pais)

 %Rock en inlges
mtitulo('Heavydirtysoul').
mgenero('Rock').
mcantante('Twenty Ones Pilots').
mescritor('Saind Ford').
midioma('Ingles').
malbum('Blurryface').
mproductora('Facick').
mpais('EEUU').

mtitulo('Stressed Out').
mgenero('Rock').
mcantante('Twenty Ones Pilots').
mescritor('Tyler Joseph').
midioma('Ingles').
malbum('Blurryface').
mproductora('Mike Elizondo').
mpais('EEUU').

mtitulo('Ride').
mgenero('Rock').
mcantante('Oasis').
mescritor('Mark Gardener').
midioma('Ingles').
malbum('Nowhere').
mproductora('The First Time').
mpais('EEUU').

mtitulo('Fairly Local').
mgenero('Rock').
mcantante('Twenty Ones Pilots').
mescritor('Tyler Joseph').
midioma('Ingles').
malbum('Blurryface').
mproductora('Ricky Reed').
mpais('EEUU').

mtitulo('Natural').
mgenero('Rock').
mcantante('Imagine Dragons').
mescritor('Robin Fredriksson').
midioma('Ingles').
malbum('Origins').
mproductora('Mattman y Robin').
mpais('EEUU').

good afternoon, I am a beginner in prologue, I am doing a recommender of movies, music and books. I have a knowledge base.


I want to know how to make rules.
 
for example; I have the movie part ...
 someone could help me or explain how to make a rule that tells me who was the author of the movie 'The Avengers'.

 and that is the specific rule so that the user can choose. since my recommender is based on movies, books and music ...

someone could help me?

I think I’ve seen this question elsewhere in swi-prolog.discourse.group.

Anyway, you need a way to match the attributes to a specific object. One way of doing this is to have a unique “object identifier” for each object (in this case, the objects are movies, books, etc.). The “object identifier” could be an atom, an integer, or something else (for various reasons, it’s best to have an “object identifier” that doesn’t encode any meaning). For example:

ptitulo(movie_001, 'Justice League vs the Fatal Five').
pdirector(movie_001, 'Sam Liu').
pescritor(movie_001, 'Alan Burnett').
pproduccion(movie_001, 'Amy McKenna Benjamin Melniker & Michael').
pprotagonistas(movie_001, 'Superman Batman Mujer Maravilla').
pgenero(movie_001, 'Accion_Aventura_Ciencia ficcion').
pclasificacion(movie_001, 'Infantil').
pidioma(movie_001, 'Ingles').
pcalidad(movie_001, 'HD_Full_HD').
panio(movie_001, 2019).
ppais(movie_001, 'EEUU').
pduracion(movie_001, '1_hora_18_minutos').

Now, you can find related things, such as:

?- pdirector(MovieId, Director), ptitulo(MovieId, Titulo).

There are probably better ways of organizing this information … the following section might be helpful (or might be a bit too advanced at this stage):
http://www.swi-prolog.org/pldoc/man?section=record

(You probably also want to pick a different representation for duration, e.g.: pduracion(movie_001, 1, 18) or pduracion(movie_001, 78).)

Thank you very much for your input…

but I want there to be a coincidence when it comes to searching …

for example…

if I asked what movie did jame cameron.

that he performs a search in my knowledge base, what movies or what he did or where the …

and so it works for any type of search …
taking into account that not only is it a movie, I also have a film, music and book recommendation … that does a specific search …

Peter already addressed the main concern in your code.
Its solution is classical Prolog, working for every implementation out there, in SWI-Prolog there are also alternative idioms you could find valuable: like dicts or library(records). I’ll just show the dicts way…

/*  File:    Base de conocimeintos.pl
    Author:  Carlo,,,
    Created: May 22 2019
    Purpose: help on https://swi-prolog.discourse.group/t/reglas-para-un-recomendador/694
*/

:- module('Base de conocimeintos',
  [records/1 % actual database entries
  ,schema/1  % optional records schema: can be handy for maintenance/documentation
  ,record/1  % simple validator
  ]).

% check the record type is known
% and has all fields defined properly
record(R) :-
  records(R),
  dict_pairs(R,T,As),
  schema(S),
  dict_pairs(S,T,Bs),
  maplist([K-_,K-_]>>true,As,Bs).

schema(libro{
  titulo:string,
  categoria:string,
  autor:string,
  np:integer,
  anio:_,    % don't care type (but of course, you should define your year/1 or anio/1 validator)
  isbn:isbn, % custom type: implement an isbn/1 to validate (maybe a DCG)
  editorial:string
}).
schema(pelicula{
  titulo:_,
  director:_,
  escritor:_,
  produccion:_,    % this should be a list, really
  protagonistas:_, % also this - at least, separe entries by comma and NOT by _
  genero:_,
  clasificacion:_,
  idioma:_,
  calidad:_,
  anio:_,
  pais:_,
  duracion:_
}).
schema(musica{
  titulo:_,
  genero:_,
  cantante:_,
  escritor:_,
  idioma:_,
  album:_,
  productora:_,
  pais:_
}).

records(pelicula{
  titulo:'Justice League vs the Fatal Five',
  director:'Sam Liu',
  escritor:'Alan Burnett',
  produccion:'Amy McKenna Benjamin Melniker & Michael',
  protagonistas:'Superman Batman Mujer Maravilla',
  genero:'Accion_Aventura_Ciencia ficcion',
  clasificacion:'Infantil',
  idioma:'Ingles',
  calidad:'HD_Full_HD',
  anio:2019,
  pais:'EEUU',
  duracion:'1_hora_18_minutos'
}).

records(pelicula{
  titulo:'Bumblebee',
  director:'Travis Knight',
  escritor:'Christina Hodson Kelly Fremon Craig',
  produccion:'Michael Bay_Stephe Davi_Tom DeSanto',
  protagonistas:'Hailee Steinfeld_John Cena_Jorge Lendeborg Jr_Rachel Crow',
  genero:'Accion_Aventura_Ciencia ficcion',
  clasificacion:'Infantil',
  idioma:'Ingles',
  calidad:'HD_FULL_HD',
  anio:2018,
  pais:'EEUU',
  duracion:'1_hora_45_minutos'
}).

records(pelicula{
  titulo:'The Lego Movie 2',
  director:'Mike_Mitchell',
  escritor:'Phil Lord_Christopher Miller',
  produccion:'Dan_Lin_Phil_Lord',
  protagonistas:'Chris Pratt_Elizabeth Banks_Tiffany Haddish_Will Arnett_Stephanie Beatriz',
  genero:'Accion_Aventura_Ciencia ficcion',
  clasificacion:'Infantil',
  idioma:'Ingles',
  calidad:'HD',
  anio:2019,
  pais:'EEUU',
  duracion:'1_hora_47_minutos'
}).

records(pelicula{
  titulo:'El regreso de Mary Poppins',
  director:'Rob Marshall',
  escritor:'Rob Marshall_John DeLuca',
  produccion:'David Magee',
  protagonistas:'Emily Blunt_Lin Manuel Miranda_Ben Whishaw_Emily Mortimer',
  genero:'Musical_Animacion_Ciencia Ficcion',
  clasificacion:'Infantil',
  idioma:'Espaniol',
  calidad:'HD_Full_HD',
  anio:2018,
  pais:'EEUU',
  duracion:'2_hora_10_minutos'
}).

records(pelicula{
  titulo:'Spider Man Into the Spider Verse',
  director:'Bob Persichetti_Peter Ramsey',
  escritor:'Christina Steinberg_Amy Pascal',
  produccion:'Phil Lord_Rodney Rothman',
  protagonistas:'Shameik Moore_Hailee Steinfeld_Mahershala Ali_Jake Johnson_Brian Tyree Henry',
  genero:'Accion_Aventuras',
  clasificacion:'Infantil',
  idioma:'Espaniol_Ingles',
  calidad:'HD_Full_HD',
  anio:2018,
  pais:'EEUU',
  duracion:'2 horas'
}).

%Recomendador de libros
  %libro(titulo,categoria,autor,no.pag,isbn,editorial,idioma,año)
records(libro{
  titulo:'El Principito',
  categoria:'Infantil',
  autor:'ANTOINE DE SAINT-EXUPERY',
  np:112,
  anio:2008,
  isbn:9789500426404,
  editorial:'EMECE'
}).

records(libro{
  titulo:'LOS CUENTOS DE BEEDLE EL BARDO',
  categoria:'Infantil',
  autor:'J K ROWLING',
  np:160,
  anio:2018,
  isbn:9788498388831,
  editorial:'SALAMANDRA'
}).

records(libro{
  titulo:'COMO EXPLICAR FISICA CUANTICA CON UN GATO ZOMBI',
  categoria:'Infantil',
  autor:'BIG VAN',
  np:200,
  anio:2018,
  isbn:9786073175852,
  editorial:'ALFAGUARA INFANTIL'
}).

records(libro{
  titulo:'50 COSAS LOQUISIMAS DE LOS ANIMALES',
  categoria:'Infantil',
  autor:'TRICIA MARTINEAU WAGNER',
  np:112,
  anio:2018,
  isbn:9786072120266,
  editorial:'LAROUSSE EDICIONES'
}).

records(libro{
  titulo:'ABAJO LOS MUROS',
  categoria:'Infantil',
  autor:'ERIC BATTUT',
  np:32,
  anio:2018,
  isbn:9788417492472,
  editorial:'BLUME'
}).

%Base de conocimiento de musica
% Musica(Titulo,Genero,Cantante,Escritor,
       % Idioma,Album,Productora,Pais)

%Rock en inlges
records(musica{
  titulo:'Heavydirtysoul',
  genero:'Rock',
  cantante:'Twenty Ones Pilots',
  escritor:'Saind Ford',
  idioma:'Ingles',
  album:'Blurryface',
  productora:'Facick',
  pais:'EEUU'
}).

records(musica{
  titulo:'Stressed Out',
  genero:'Rock',
  cantante:'Twenty Ones Pilots',
  escritor:'Tyler Joseph',
  idioma:'Ingles',
  album:'Blurryface',
  productora:'Mike Elizondo',
  pais:'EEUU'
}).

records(musica{
  titulo:'Ride',
  genero:'Rock',
  cantante:'Oasis',
  escritor:'Mark Gardener',
  idioma:'Ingles',
  album:'Nowhere',
  productora:'The First Time',
  pais:'EEUU'
}).

records(musica{
  titulo:'Fairly Local',
  genero:'Rock',
  cantante:'Twenty Ones Pilots',
  escritor:'Tyler Joseph',
  idioma:'Ingles',
  album:'Blurryface',
  productora:'Ricky Reed',
  pais:'EEUU'
}).

records(musica{
  titulo:'Natural',
  genero:'Rock',
  cantante:'Imagine Dragons',
  escritor:'Robin Fredriksson',
  idioma:'Ingles',
  album:'Origins',
  productora:'Mattman y Robin',
  pais:'EEUU'
}).

% custom types definition
isbn(I) :- string(I).

Save the above snippet to (for instance) ‘Base de conocimeintos.pl’. Example usage:

?- ['Base de conocimeintos'].

?- aggregate(count,X^record(X),N).
N = 15.

?- records(R), R >:< libro{anio:2008,autor:A}.
R = libro{anio:2008, autor:'ANTOINE DE SAINT-EXUPERY', categoria:'Infantil', editorial:'EMECE', isbn:9789500426404, np:112, titulo:'El Principito'},
A = 'ANTOINE DE SAINT-EXUPERY' .

HTH, Ciao.

1 Like

me gustaria tener un regla especifica o una regla general donde pueda decir o mejor dicho preguntarle a prolog…

¿Quien fue el director de Bumblebee? y el me responda
El director de la pelicula Bumblebee fue : Travis Knight.

relizar preguntas a prolog, y el con base a una pregunta haga una busqueda en la base de conocimientos proporcionada, y me la devuelva de tipo
¿Quien fue el director de Bumblebee? y el me responda
El director de la pelicula Bumblebee fue : Travis Knight.

A pseudo natural language interface to your database is rather easy to write in Prolog, but it’s a (potentially) big task. I don’t want to deprive you of the pleasure to learn this language. Decide the representation and ask for help when you’re stuck on something specific.

thank you.

I have a doubt.

but if I want to know what are the movies or all the movies that I have of star wras. How would the consultation?

Assuming that in my knowledge base I have the whole saga of Star Wars.

how would the query, and as a result only show me the titles of the movies.

Beforehand thank you very much

Can I ask a question?
Excuse me but I’m not very good at prolog…

Can I ask a question ?