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.