Programación en Prolog: Ejemplos Básicos y Ejercicios Prácticos
Prolog, un lenguaje de programación lógica, es conocido por su enfoque declarativo y su capacidad para resolver problemas de manera eficiente mediante inferencia lógica. En este capítulo, exploraremos algunos ejemplos básicos de programación en Prolog, con un enfoque en la resolución de problemas prácticos a través de la definición de predicados.
Comenzaremos con un programa simple que encuentra el máximo y el mínimo de dos números, luego exploraremos el cálculo de la resistencia equivalente de un circuito resistivo y, finalmente, examinaremos la identificación de segmentos de línea horizontales, verticales u oblicuos. Estos ejemplos nos permitirán comprender cómo se define la lógica en Prolog y cómo se puede usar para resolver problemas de manera intuitiva y eficiente.
Encontrar el Máximo y Mínimo de Dos Números
Para encontrar el máximo y el mínimo de dos números en Prolog, podemos usar predicados como find_max
y find_min
. Estos predicados toman dos números como argumentos y establecen una relación entre ellos. El predicado find_max(A, B, Max)
se cumple si Max
es el máximo entre A
y B
, mientras que find_min(A, B, Min)
se cumple si Min
es el mínimo entre A
y B
.
«`prolog
findmax(A, B, A):- A >= B.
findmax(A, B, B):- A < B.
findmin(A, B, A):- A =< B.
findmin(A, B, B):- A > B.
«`
En este código, definimos dos reglas para cada predicado. La primera regla se cumple si A
es mayor o igual que B
, y en este caso, Max
o Min
es igual a A
. La segunda regla se cumple si A
es menor que B
, y en este caso, Max
o Min
es igual a B
.
Para usar estos predicados, podemos ingresar consultas en la consola de Prolog. Por ejemplo, la consulta find_max(5, 3, Max)
devolverá Max = 5
, ya que 5
es el máximo entre 5
y 3
. De manera similar, la consulta find_min(5, 3, Min)
devolverá Min = 3
.
Cálculo de la Resistencia Equivalente de un Circuito Resistivo
Un circuito resistivo puede consistir en resistencias conectadas en serie o en paralelo. Las reglas para calcular la resistencia equivalente son las siguientes:
- Resistencias en serie: La resistencia equivalente es la suma de las resistencias individuales.
- Resistencias en paralelo: La resistencia equivalente se calcula como el inverso de la suma de los inversos de las resistencias individuales.
Para programar en prolog el cálculo de la resistencia equivalente, podemos definir predicados como series
y parallel
. El predicado series(Resistencias, ResistenciaEquivalente)
se cumple si ResistenciaEquivalente
es la resistencia equivalente de las resistencias en la lista Resistencias
. De manera similar, el predicado parallel(Resistencias, ResistenciaEquivalente)
se cumple si ResistenciaEquivalente
es la resistencia equivalente de las resistencias en paralelo en la lista Resistencias
.
«`prolog
series([], 0).
series([R|Rs], Req):- series(Rs, ReqRs), Req is ReqRs + R.
parallel([], 1).
parallel([R|Rs], Req):- parallel(Rs, ReqRs), Req is 1 / (1/R + 1/ReqRs).
«`
En este código, definimos dos reglas para cada predicado. La primera regla para series
se cumple si la lista de resistencias está vacía, y en este caso, la resistencia equivalente es 0. La segunda regla se cumple si la lista no está vacía, y en este caso, se calcula la resistencia equivalente de la cola de la lista recursivamente y se suma la primera resistencia.
Las reglas para parallel
funcionan de manera similar. La primera regla se cumple si la lista está vacía, y en este caso, la resistencia equivalente es 1 (el inverso de 0). La segunda regla se cumple si la lista no está vacía, y en este caso, se calcula la resistencia equivalente de la cola de la lista recursivamente y luego se calcula el inverso de la suma de los inversos de la primera resistencia y la resistencia equivalente de la cola.
Para usar estos predicados, podemos ingresar consultas como series([10, 20, 30], Req)
para obtener la resistencia equivalente de las resistencias en serie 10
, 20
y 30
. De manera similar, la consulta parallel([10, 20, 30], Req)
devolverá la resistencia equivalente de las resistencias en paralelo 10
, 20
y 30
.
Identificación de Segmentos de Línea Horizontal, Vertical u Oblicuo
Un segmento de línea se puede identificar como horizontal, vertical u oblicuo basado en las coordenadas de sus puntos finales.
Definimos los predicados horizontal
, vertical
y oblique
que toman las coordenadas de los puntos finales del segmento como argumentos y verifican si el segmento es horizontal, vertical u oblicuo, respectivamente.
prolog
horizontal((X1, Y1), (X2, Y2)):- Y1 == Y2.
vertical((X1, Y1), (X2, Y2)):- X1 == X2.
oblique((X1, Y1), (X2, Y2)):- X1 == X2, Y1 == Y2.
En este código, definimos una regla para cada predicado. La regla horizontal
se cumple si las coordenadas Y de los dos puntos finales son iguales, lo que indica que el segmento es horizontal. La regla vertical
se cumple si las coordenadas X de los dos puntos finales son iguales, lo que indica que el segmento es vertical. La regla oblique
se cumple si las coordenadas X y Y de los dos puntos finales son diferentes, lo que indica que el segmento es oblicuo.
Para usar estos predicados, podemos ingresar consultas como horizontal((1, 2), (5, 2))
para verificar si el segmento de línea con puntos finales en (1, 2) y (5, 2) es horizontal. De manera similar, las consultas vertical((1, 2), (1, 6))
y oblique((1, 2), (4, 6))
verificarán si los segmentos de línea respectivos son verticales y oblicuos, respectivamente.
Conclusión
Estos son solo algunos ejemplos básicos de programación en Prolog. Con un poco de práctica, podemos crear programas más complejos que resuelvan problemas más desafiantes. La naturaleza declarativa de Prolog lo hace adecuado para resolver problemas de lógica, planificación, análisis de datos y más.