Cómo usar el compilador de Prolog online
- Escribe tus hechos y reglas en el editor, o parte del ejemplo con Restablecer ejemplo.
- Indica qué ejecutar con una directiva
:- initialization(main)., dondemaines un predicado que llama a los objetivos que quieres probar e imprime los resultados. - Pulsa Ejecutar o usa Ctrl + Enter (⌘ + Enter en Mac). El programa se carga como el archivo
main.ply sus directivas se ejecutan al cargarlo. - 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/1ynl/0imprimen 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/2y los operadores de comparación, con enteros y decimales. El20!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 enmaine imprime las respuestas, o recógelas todas confindall/3oforall/2. - No hay entrada estándar.
read/1no 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 + 2ligaXal término1+2. UsaX is 1 + 2para evaluarlo y=:=para comparar dos números.- Las variables empiezan por una letra mayúscula o por
_.namees un átomo yNamees 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_Namesi se deja sin usar intencionadamente. - Usa el corte con cuidado. El
max/3de arriba funciona bien conmax(3, 7, M), pero la segunda cláusula depende del corte, así quemax(5, 3, 3)tiene éxito por error. Escribirmax(X, Y, Y) :- X < Y.como segunda cláusula lo hace seguro. Un corte mal colocado también puede ocultar soluciones quefindalldevolverí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 objetivoparent.
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