¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Fundamentos de Prolog

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de contenedores11 min de lectura8 comandos

¿Quién es el abuelo de Cat?

En un árbol genealógico se ve subiendo dos líneas. Un programa escrito en la mayoría de los lenguajes necesitaría instrucciones paso a paso para hacer lo mismo. Prolog funciona de otra manera: escribes lo que es verdad, haces una pregunta y él encuentra la respuesta.

Al final de esta lección

Nota

Puedo hacer preguntas a un programa Prolog sobre hechos y reglas.

Palabras clave

  • Hecho: algo que se le dice al programa que es verdad.
  • Regla: una afirmación que es verdad si otras afirmaciones lo son.
  • Consulta: una pregunta que haces al programa.
  • Variable: un nombre que empieza por mayúscula y representa una respuesta por encontrar, como X.
  • Recursión: una regla que se usa a sí misma.

Para empezar: lo que ya sabes

Nota

Responde mentalmente. 1. Si x + 2 = 5, ¿cuánto vale x? 2. En «si llueve, coge el paraguas», ¿qué tiene que ser verdad antes de coger el paraguas? 3. En un árbol genealógico, ¿qué es un abuelo? Respuestas: 3, porque x representa un número que hace cierta la igualdad; que esté lloviendo; un padre o madre de un padre o madre.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra de arriba de la lección y espera a que diga que está en marcha. Hay un solo contenedor, prolog. No se abre nada en un navegador, así que usa el terminal, donde docker exec prolog ejecuta una orden dentro de él. Cada orden carga un archivo, hace una pregunta y se detiene. Todo lo que se imprime está en inglés, sea cual sea el idioma de esta página. Cada botón Ejecutar de abajo escribe su orden en el terminal de tu laboratorio, una detrás de otra en la misma sesión. Para verlas o escribir las tuyas, pulsa Abrir terminal (pestaña nueva) en la barra.

Un hecho es una línea verdadera

Esta orden imprime el archivo de hechos. Cada línea como parent(tom, ann). es un hecho, que se lee «tom es padre de ann», y termina con un punto. Las líneas que empiezan por % son comentarios. Prolog no sabe nada más que lo que dice el archivo.

Comando
docker exec prolog cat facts.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una consulta pregunta si algo es verdad

Esta carga facts.pl y pregunta si tom es padre de ann. La opción -g es el objetivo que se ejecuta, y -t halt lo detiene después. Imprime yes, porque el hecho está ahí. La segunda pregunta si ann es padre de dan. Eso no está en los hechos: el objetivo falla y no se imprime nada. Sin salida significa «no se puede demostrar que sea verdad».

Comando
docker exec prolog swipl -q -g "parent(tom, ann), writeln(yes)" -t halt facts.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker exec prolog swipl -q -g "parent(ann, dan), writeln(yes)" -t halt facts.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una variable pregunta «¿quién?»

Una mayúscula crea una variable, que Prolog rellena buscando todos los hechos que encajan. forall recorre cada respuesta y writeln la imprime. La primera orden imprime los hijos de tom, ann y luego ben, en el orden en que están escritos los hechos. La segunda da la vuelta a la pregunta: ¿quién es padre de ben? Imprime tom.

Comando
docker exec prolog swipl -q -g "forall(parent(tom, X), writeln(X))" -t halt facts.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker exec prolog swipl -q -g "forall(parent(X, ben), writeln(X))" -t halt facts.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprueba

Consejo

¿Qué hijos tiene ben y en qué orden se imprimirían? Respuesta: dan y luego eve, porque esos hechos están escritos en ese orden. No se imprime nada para una persona sin hijos.

Una regla es verdad si sus partes lo son

family.pl contiene reglas. La regla grandparent(X, Z) :- parent(X, Y), parent(Y, Z). se lee «X es abuelo de Z si X es padre de algún Y y Y es padre de Z». El :- significa «si» y la coma significa «y». Nadie escribió un hecho sobre abuelos. Esta orden pide los nietos de tom e imprime cat, dan y eve.

Comando
docker exec prolog swipl -q -g "forall(grandparent(tom, X), writeln(X))" -t halt family.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una regla puede usarse a sí misma

Un ascendiente es un padre, o un padre de un ascendiente. Esa segunda regla se llama a sí misma, así que recorre el árbol hasta donde llega. findall reúne todas las respuestas en una lista. La primera orden imprime [ann,ben,cat,dan,eve] y la segunda, para ann, imprime [cat].

Comando
docker exec prolog swipl -q -g "findall(X, ancestor(tom, X), L), writeln(L)" -t halt family.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker exec prolog swipl -q -g "findall(X, ancestor(ann, X), L), writeln(L)" -t halt family.pl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente piensa que un programa Prolog se ejecuta de arriba abajo, línea a línea, como una receta. No es así. Los hechos y las reglas dicen lo que es verdad, y la pregunta decide lo que se calcula. Y una consulta que no imprime nada no significa que el programa esté roto ni que la respuesta sea falsa en la vida real: significa que la respuesta no se puede demostrar con los hechos escritos. Añade un hecho y la misma pregunta puede tener éxito.

Comprobación final

Consejo

Responde sin mirar atrás. 1. ¿Qué dice parent(tom, ann).? 2. ¿Qué diferencia a X de tom? 3. ¿Qué significa :- en una regla? 4. ¿Cómo se llama una regla que se usa a sí misma? Respuestas: tom es padre de ann, y es un hecho; X empieza por mayúscula, así que es una variable por encontrar; «si»; recursión.

Para docentes

Consejo

Esta lección es un pequeño ejemplo de lección que se hace en un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia de cada estudiante. El laboratorio es un contenedor con el intérprete SWI-Prolog y tres archivos pequeños, y nada aquí se corrige solo: el estudiante entrega las preguntas que hizo con lo que respondió cada una, una regla propia añadida a family.pl con una pregunta que la muestre funcionando, y una frase sobre la diferencia entre un hecho y una regla. Puntos clave: 1. Un hecho es una afirmación verdadera. 2. Una consulta pregunta si algo es verdad, y una variable pregunta «quién». 3. Una regla es verdad si sus partes lo son. 4. Una regla que se usa a sí misma recorre una estructura hasta donde llega. Error frecuente: leer un programa como una lista de instrucciones, o leer la falta de salida como «falso». Material: el laboratorio y su terminal. Consejo: pida a los estudiantes que prevean las respuestas antes de ejecutar la orden y que luego añadan un hecho y vean qué cambia. Las respuestas son exactas e iguales cada vez, en el orden en que están escritos los hechos. Los nombres y todos los mensajes están en inglés, sea cual sea el idioma de la página.

Sobre este laboratorio y su código: Laboratorio de Prolog: programación lógica con hechos, reglas y preguntas, en el navegador

¿Enseñas a una clase? Asigna estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.