Prolog online - IDE, editor, compilador, intérprete

Ejecuta programas Prolog online con SWI-Prolog compilado a WebAssembly: hechos, reglas, recursión, findall y format, mostrando errores y advertencias.

SWI-Prolog 10 (swipl-wasm) · Se ejecuta en tu navegador, así que tu código nunca llega a nuestros servidores.
main.plProlog
Salida

            
        
Ctrl/⌘ + Enter para ejecutar

Funciones del compilador de Prolog online (IDE, editor & intérprete)

Escribe, ejecuta y prueba código Prolog online y gratis. Esta página funciona como IDE, editor de código, compilador e intérprete de Prolog online, todo en uno: escribe tu código, pulsa Ejecutar y verás el resultado al momento. Todo se ejecuta en tu navegador, sin nada que instalar ni cuentas que crear.

  • Ejecuta código al instante: SWI-Prolog 10 (swipl-wasm), con resultados en menos de un segundo tras la primera carga.
  • Editor de código: resaltado de sintaxis, números de línea, emparejamiento de corchetes y cierre automático de corchetes.
  • Errores claros: los mensajes de error y las advertencias aparecen en el panel de salida, igual que en tu propio ordenador.
  • Pantalla completa: Ctrl/⌘ + Shift + F, tamaño de fuente ajustable, diseño en paralelo o apilado y paneles redimensionables.
  • Guardado automático: tu código se guarda en tu navegador; descárgalo como main.pl o cópialo con un clic.
  • Experimenta sin riesgo: un límite de tiempo y un botón Detener acaban con los bucles infinitos.
  • Privado: el entorno de ejecución de Prolog funciona en tu dispositivo, así que tu código nunca se sube.
  • Modo oscuro y atajos de teclado: Ctrl/⌘ + Enter ejecuta el código.
  • Gratis: sin registro y sin límites de uso.

Aprende otros lenguajes de programación

Cómo usar el compilador de Prolog online

  1. Escribe tus hechos y reglas en el editor, o parte del ejemplo con Restablecer ejemplo.
  2. Indica qué ejecutar con una directiva :- initialization(main)., donde main es un predicado que llama a los objetivos que quieres probar e imprime los resultados.
  3. Pulsa Ejecutar o usa Ctrl + Enter (⌘ + Enter en Mac). El programa se carga como el archivo main.pl y sus directivas se ejecutan al cargarlo.
  4. Revisa el panel Salida para ver el texto impreso, los errores y las advertencias. En Límite de tiempo, elige 5, 15 o 60 segundos, y usa Detener si una recursión no termina nunca.

El entorno de ejecución de SWI-Prolog pesa unos 4 MB y tu navegador lo guarda en caché tras la primera visita. Conserva tu programa con Copiar o con la descarga de main.pl, cambia el tamaño del texto con A− y A+, cambia la disposición de los paneles con el botón de diseño y usa Pantalla completa (Ctrl/⌘ + Shift + F, Esc para salir) para programas más largos.

Todo se ejecuta en tu navegador. El programa nunca se envía a un servidor, y el editor guarda tu última versión solo en el almacenamiento local de tu navegador.

Qué se admite

La página usa SWI-Prolog 10 compilado a WebAssembly (swipl-wasm). Es el sistema SWI-Prolog real, no un intérprete simplificado.

  • Consultar un archivo: tu código se carga exactamente como lo cargaría consult('main.pl'), así que funcionan las cláusulas, los operadores y las directivas.
  • Predicados de salida: format/2, write/1, writeln/1, print/1 y nl/0 imprimen en el panel de salida.
  • Listas y predicados de todas las soluciones: member/2, append/3, length/2, msort/2, findall/3, bagof/3, setof/3, forall/2.
  • Aritmética con is/2 y los operadores de comparación, con enteros y decimales. El 20! del ejemplo se calcula de forma exacta.
  • Diagnósticos tal como los imprime SWI-Prolog, por ejemplo advertencias de variables singleton y errores como ERROR: ... Arithmetic: `foo/0' is not a function.

Qué es distinto de un Prolog de escritorio:

  • No hay un indicador interactivo de consultas ?-, así que no puedes escribir consultas y pulsar ; para obtener más respuestas. Pon las consultas en main e imprime las respuestas, o recógelas todas con findall/3 o forall/2.
  • No hay entrada estándar. read/1 no tiene de dónde leer, así que escribe tus datos de prueba como hechos.

Lo básico de Prolog en un programa

% Hechos
likes(mary, wine).
likes(john, wine).
likes(john, mary).

% Una regla: X e Y son amigos si a ambos les gusta lo mismo
friends(X, Y) :- likes(X, Z), likes(Y, Z), X \== Y.

% Recursión sobre una lista, con un acumulador
sum_list_acc([], Acc, Acc).
sum_list_acc([H|T], Acc0, Sum) :- Acc1 is Acc0 + H, sum_list_acc(T, Acc1, Sum).

% El corte (!) se compromete con la primera cláusula que coincide
max(X, Y, X) :- X >= Y, !.
max(_, Y, Y).

main :-
    findall(X-Y, friends(X, Y), Pairs), writeln(Pairs),
    sum_list_acc([1,2,3,4], 0, S), format("sum = ~w~n", [S]),
    max(3, 7, M), format("max = ~w~n", [M]).

:- initialization(main).

Al ejecutarlo imprime [mary-john,john-mary], sum = 10 y max = 7.

Errores habituales

  • = es unificación, no asignación ni aritmética. X = 1 + 2 liga X al término 1+2. Usa X is 1 + 2 para evaluarlo y =:= para comparar dos números.
  • Las variables empiezan por una letra mayúscula o por _. name es un átomo y Name es una variable, así que una errata en minúscula cambia sin avisar el significado de una cláusula.
  • Las advertencias de singleton significan que una variable aparece una sola vez en una cláusula, lo que suele ser una errata. Cámbiale el nombre a _ o _Name si se deja sin usar intencionadamente.
  • Usa el corte con cuidado. El max/3 de arriba funciona bien con max(3, 7, M), pero la segunda cláusula depende del corte, así que max(5, 3, 3) tiene éxito por error. Escribir max(X, Y, Y) :- X < Y. como segunda cláusula lo hace seguro. Un corte mal colocado también puede ocultar soluciones que findall devolvería en otro caso.
  • La recursión por la izquierda entra en bucle. Una regla como ancestor(X, Y) :- ancestor(X, Z), parent(Z, Y). se llama a sí misma sin fin. Pon primero el objetivo parent.
Consejo: si main falla en lugar de tener éxito, SWI-Prolog imprime una advertencia de que el objetivo de inicialización falló. Añade llamadas a writeln/1 entre los objetivos para ver hasta dónde llega.

Preguntas frecuentes

¿Cómo ejecuto una consulta?

Escríbela dentro de un predicado como main y añade :- initialization(main). al final del archivo. También puedes poner un objetivo directamente en una directiva, por ejemplo :- X is 2^10, writeln(X).

¿Es Prolog estándar?

Es SWI-Prolog, que sigue el estándar ISO y añade muchas extensiones. El texto entre comillas dobles es una cadena en SWI-Prolog, algo que importa si estás acostumbrado a que signifique una lista de códigos de caracteres.

¿Puedo obtener todas las respuestas de una consulta?

Sí. Usa findall/3 para recogerlas en una lista, o forall/2 para imprimir cada una, como hace el programa de ejemplo.

¿Hay otros lenguajes lógicos o funcionales disponibles?

Prueba el intérprete de Scheme online o el compilador de Clojure online, o mira todos los compiladores online.

Actualizado

Copiado al portapapeles