Fundamentos de Programación Lógica: Ejemplos Prácticos con Prolog

Clasificado en Geografía

Escrito el en español con un tamaño de 5,55 KB

Conceptos Fundamentales de Programación Lógica con Ejemplos

Este documento presenta una serie de ejemplos prácticos en programación lógica, ilustrando la definición de bases de datos, el manejo de predicados, cláusulas y objetivos, así como la manipulación de estructuras de datos como listas y la implementación de lógica para números.

Sección 1: Base de Datos y Predicados de Departamentos

A continuación, se define una base de datos temporal que almacena información sobre departamentos, incluyendo su población y superficie. Se utilizan predicados no deterministas para representar estos datos.

Definición de Predicado y Cláusulas

database - tmp
  nondeterm departamento_poblacion_superficie(STRING, INTEGER, INTEGER)

clauses
  departamento_poblacion_superficie("Lima", 8445, 35).
  departamento_poblacion_superficie("Piura", 1676, 36).
  departamento_poblacion_superficie("La Libertad", 1617, 25).
  departamento_poblacion_superficie("Cajamarca", 1388, 33).
  departamento_poblacion_superficie("Puno", 1268, 67).
  departamento_poblacion_superficie("Junin", 1225, 44).
  departamento_poblacion_superficie("Cuzco", 1171, 72).
  departamento_poblacion_superficie("Arequipa", 1152, 63).
  departamento_poblacion_superficie("Lambayeque", 1113, 14).
  departamento_poblacion_superficie("Ancash", 1063, 36).
  departamento_poblacion_superficie("Loreto", 892, 369).
  departamento_poblacion_superficie("Callao", 877, 1).
  departamento_poblacion_superficie("Huanuco", 762, 37).
  departamento_poblacion_superficie("San Martin", 729, 51).
  departamento_poblacion_superficie("Ica", 712, 21).
  departamento_poblacion_superficie("Ayacucho", 612, 44).
  departamento_poblacion_superficie("Huancavelica", 455, 22).
  departamento_poblacion_superficie("Ucayali", 432, 102).
  departamento_poblacion_superficie("Apurimac", 404, 21).
  departamento_poblacion_superficie("Amazonas", 376, 39).
  departamento_poblacion_superficie("Tacna", 289, 16).
  departamento_poblacion_superficie("Pasco", 280, 25).
  departamento_poblacion_superficie("Tumbes", 200, 5).
  departamento_poblacion_superficie("Moquegua", 162, 16).
  departamento_poblacion_superficie("Madre de Dios", 110, 85).

Sección 2: Lógica para Signos Zodiacales

Esta sección demuestra cómo definir predicados para determinar un signo zodiacal basándose en una fecha específica (día y mes). Se utilizan cláusulas para establecer las reglas de inferencia.

Predicados y Cláusulas para Signos

predicates
  nondeterm departamento(STRING, INTEGER, INTEGER)

clauses
  signo(X, Dia, Mes) :- signo_desde_hasta(X, D1, M1, _, _),
                        Mes = M1,
                        Dia >= D1.
  signo(X, Dia, Mes) :- signo_desde_hasta(X, _, _, D2, M2),
                        Mes = M2,
                        Dia \= D2.

goal
  signo(X, 5, 7),
  format(Mensaje, "Para la fecha 5/7 el signo es => %s", X), nl,
  write(Mensaje).

%goal
%signo(X, 5, 7),
%format(Mensaje, "Para la fecha 5/7 el signo es => %s", X), nl,
%write(Mensaje).
%nl: salto de línea

Sección 3: Manejo de Listas

Ejemplos de cómo definir dominios y predicados para trabajar con listas, específicamente para asignar y extraer elementos de la cabecera de una lista.

Dominios, Predicados y Cláusulas de Listas

DOMAINS
  Lista_Elementos = String*

PREDICATES
  asignar_lista(Lista_Elementos)
  nondeterm cabecera_lista(String)

CLAUSES
  asignar_lista(Lista_Dias) :- Lista_Dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"].
  cabecera_lista(X) :- asignar_lista(LD), LD = [Cabecera|_], X = Cabecera.

GOAL
  cabecera_lista("Lunes"),
  write("El Primer Día de la Semana es => Lunes"), nl.

%cabecera_lista(X),
%write("El Primer Día de la Semana es => "), write(X), nl.

Sección 4: Identificación de Números Pares e Impares

Esta sección ilustra la implementación de predicados para identificar números pares e impares dentro de un rango dado, utilizando operaciones aritméticas y lógica condicional.

Predicados y Cláusulas para Números

predicates
  nondeterm entre(INTEGER, INTEGER, INTEGER)
  nondeterm entre_par(INTEGER, INTEGER, INTEGER)
  nondeterm entre_impar(INTEGER, INTEGER, INTEGER)

clauses
  entre(N1, N2, N1) :- N1 \= N2.
  entre(N1, N2, X) :- N1 < N2, N3 is N1 + 1, entre(N3, N2, X).
  entre_par(N1, N2, X) :- entre(N1, N2, X), Z is X mod 2, Z = 0.
  entre_impar(N1, N2, X) :- entre(N1, N2, X), Z is X mod 2, Z = 1.

goal
  entre_par(1, 10, X).

Sección 5: Conceptos de Recursividad

Aunque el ejemplo proporcionado es idéntico al de la sección de manejo de listas, esta sección está destinada a ilustrar cómo se pueden aplicar principios de recursividad en la programación lógica para procesar estructuras de datos o resolver problemas de manera iterativa.

Dominios, Predicados y Cláusulas (Ejemplo Repetido)

DOMAINS
  Lista_elementos = String*

PREDICATES
  asignar_lista(Lista_elementos)
  nondeterm cabecera_lista(String)

CLAUSES
  asignar_lista(Lista_dias) :- Lista_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"].
  cabecera_lista(X) :- asignar_lista(LD), LD = [Cabecera|_], X = Cabecera.

GOAL
  %cabecera_lista("Lunes"),
  cabecera_lista(X),
  write("El primer día de la semana es Lunes"), nl.

Entradas relacionadas: