Programando en Prolog: Relaciones

Un programa en Prolog se compone principalmente de hechos, reglas y consultas, organizados como cláusulas terminadas en punto. Estos elementos forman la base de conocimiento y permiten que el intérprete deduzca respuestas mediante el mecanismo de unificación y backtracking.

Recordemos los componentes de un programa Prolog:

  1. Hechos:  Definen relaciones básicas entre objetos.
  2. Reglas:  Expresan implicaciones lógicas: un hecho depende de otros.
  3. Consultas:  Son las preguntas que el usuario hace al intérprete.
  4. Variables: Representan objetos desconocidos que Prolog intentará instanciar.

En la entrega anterior nos enfocamos en los hechos. Ahora veremos las relaciones.

Observemos el siguiente programa (con hechos poliádicos, representación más descriptiva, contrario a los monoádicos, representaciones más simples).

parientes.pl

% Hechos poliádicos
padre(juan, maria).
padre(juan, pedro).
padre(pedro, ana).

% Regla
abuelo(X, Y) :- padre(X, Z), padre(Z, Y).

Consulta:

?- [parientes].
?- abuelo(juan, Quien).

Salida:

Quien = ana

Aquí se establece la relación padre-hijo:

  • Juan es padre de María. 
  • Juan es padre de Pedro. 
  • Pedro es padre de Ana.

Por lo que el Abuelo de Ana es Juan. La consulta activa el motor lógico para encontrar coincidencias y construir la relación abuelo-nieto.

Tenemos entonces que: cada hecho es una relación binaria entre dos individuos.

Miremos ejemplos de hechos poliádicos, donde enmarcamos las relaciones entre los objetos.

relaciones.pl

% Hechos poliádicos
es_un_objeto(libro, papel) % El libro es un objeto y está hecho de papel
es_un_objeto(tenedor, plata) % El tenedor es un objeto y está hecho de plata
es_un_animal(gato, felino) % El gato es un animal y es un felino
es_un_animal(tiburon, acuatio) % El tiburón es un animal y es acuático

Ahora crearemos algunas reglas para realizar consultas.

Consulta para saber si es un objeto:

% Consulta
es_objeto(X) :- es_un_objeto(X, _).

Consulta para saber si es un animal:

% Consulta
es_animal(X) :- es_un_animal(X, _).

Consulta para saber el material de qué esta hecho:

% Consulta
material_de(X, M) :- es_un_objeto(X, M).

Consulta para saber la clasificación:

% Consulta 
clasificacion_de(X, C) :- es_un_animal(X, C).

Consulta para saber si son del mismo tipo:

% Consultas
mismo_tipo(X, Y) :- es_un_objeto(X, _), es_un_objeto(Y, _).
mismo_tipo(X, Y) :- es_un_animal(X, _), es_un_animal(Y, _).

Consulta para saber a qué categoría ptertenece:

% Consultas 
categoria(X, objeto) :- es_un_objeto(X, _).
categoria(X, animal) :- es_un_animal(X, _).

Consultamos:

$ swipl
?- [relaciones].
?- es_objeto(libro).
true.
?- es_animal(gato).
true.
?- material_de(tenedor, M).
M = plata.
?- clasificacion_de(tiburon, C).
C = acuatio.
?- mismo_tipo(gato, tiburon).
true.
?- mismo_tipo(libro, gato).
false.
?- categoria(libro, C).
C = objeto.
?- categoria(gato, C).
C = animal.

Continuaremos en próximas entregas.

Enlaces:

https://ferestrepoca.github.io/paradigmas-de-programacion/proglogica/tutoriales/prolog-gh-pages/index.html
https://www.tutorialspoint.com/prolog/prolog_relations.htm
https://virtual.cuautitlan.unam.mx/intar/?page_id=235

Comentarios