Prolog online - IDE, editor, compilatore, interprete

RSS

Esegui programmi Prolog online con SWI-Prolog compilato in WebAssembly: fatti, regole, ricorsione, findall e format, con errori e avvisi visualizzati.

SWI-Prolog 10 (swipl-wasm) · Funziona nel tuo browser, quindi il tuo codice non raggiunge mai i nostri server.
main.plProlog
Output

            
        
Ctrl/⌘ + Enter per eseguire

Funzionalità del compilatore Prolog online (IDE, editor e interprete)

Scrivi, esegui e testa codice Prolog online gratis. Questa pagina è al tempo stesso IDE Prolog online, editor di codice, compilatore e interprete: scrivi il codice, premi Esegui e vedi subito l'output. Tutto funziona nel tuo browser, senza nulla da installare e senza creare un account.

  • Esecuzione immediata: SWI-Prolog 10 (swipl-wasm), con output in meno di un secondo dopo il primo caricamento.
  • Editor di codice: evidenziazione della sintassi, numeri di riga, corrispondenza e chiusura automatica delle parentesi.
  • Errori chiari: messaggi di errore e avvisi compaiono nel pannello di output, come sul tuo computer.
  • Schermo intero: Ctrl/⌘ + Shift + F, dimensione del carattere regolabile, layout affiancato o impilato e pannelli ridimensionabili.
  • Salvataggio automatico: il tuo codice resta nel browser; scaricalo come main.pl o copialo con un clic.
  • Sperimenta in sicurezza: un limite di tempo e un pulsante Interrompi fermano i cicli infiniti.
  • Privato: il runtime Prolog funziona sul tuo dispositivo, quindi il codice non viene mai caricato.
  • Modalità scura e scorciatoie da tastiera: Ctrl/⌘ + Enter esegue il codice.
  • Gratis: nessuna registrazione, nessun limite di utilizzo.

Impara altri linguaggi di programmazione

Come usare il compilatore Prolog online

  1. Scrivi i tuoi fatti e le tue regole nell'editor, oppure parti dall'esempio con Ripristina esempio.
  2. Indica cosa eseguire con una direttiva :- initialization(main)., dove main è un predicato che chiama gli obiettivi (goal) che vuoi provare e stampa i risultati.
  3. Premi Esegui oppure usa Ctrl + Invio (⌘ + Invio su Mac). Il programma viene caricato come file main.pl e le sue direttive vengono eseguite durante il caricamento.
  4. Controlla il pannello Output per testo stampato, errori e avvisi. Scegli un limite di tempo di 5, 15 o 60 secondi e usa Interrompi se una ricorsione non finisce mai.

Il runtime SWI-Prolog pesa circa 4 MB e viene messo in cache dal browser dopo la prima visita. Conserva il tuo programma con Copia o con il download di main.pl, ridimensiona il testo con A− e A+, cambia la disposizione dei pannelli con il pulsante del layout e usa Schermo intero (Ctrl/⌘ + Maiusc + F, Esc per uscire) per i programmi più lunghi.

Tutto gira nel tuo browser. Il programma non viene mai inviato a un server, e l'editor salva la tua ultima versione solo nel local storage del tuo browser.

Cosa è supportato

La pagina usa SWI-Prolog 10 compilato in WebAssembly (swipl-wasm). È il vero sistema SWI-Prolog, non un interprete semplificato.

  • Consultare un file: il tuo codice viene caricato esattamente come lo caricherebbe consult('main.pl'), quindi clausole, operatori e direttive funzionano tutti.
  • Predicati di output: format/2, write/1, writeln/1, print/1 e nl/0 stampano tutti nel pannello di output.
  • Liste e predicati per tutte le soluzioni: member/2, append/3, length/2, msort/2, findall/3, bagof/3, setof/3, forall/2.
  • Aritmetica con is/2 e gli operatori di confronto, su interi e numeri in virgola mobile. Il 20! dell'esempio viene calcolato in modo esatto.
  • Diagnostica come la stampa SWI-Prolog, ad esempio avvisi sulle variabili singleton ed errori come ERROR: ... Arithmetic: `foo/0' is not a function.

Cosa cambia rispetto a un Prolog desktop:

  • Non c'è un prompt interattivo di query ?-, quindi non puoi digitare query e premere ; per altre risposte. Metti le query in main e stampa le risposte, oppure raccoglile tutte con findall/3 o forall/2.
  • Nessuno standard input. read/1 non ha nulla da leggere, quindi scrivi i tuoi dati di prova come fatti.

Le basi di Prolog in un solo programma

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

% Una regola: X e Y sono amici se a entrambi piace la stessa cosa
friends(X, Y) :- likes(X, Z), likes(Y, Z), X \== Y.

% Ricorsione su una lista, con un accumulatore
sum_list_acc([], Acc, Acc).
sum_list_acc([H|T], Acc0, Sum) :- Acc1 is Acc0 + H, sum_list_acc(T, Acc1, Sum).

% Il cut (!) si impegna sulla prima clausola che corrisponde
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).

Eseguendolo stampa [mary-john,john-mary], sum = 10 e max = 7.

Errori comuni

  • = è unificazione, non assegnazione né aritmetica. X = 1 + 2 lega X al termine 1+2. Usa X is 1 + 2 per valutarlo e =:= per confrontare due numeri.
  • Le variabili iniziano con una lettera maiuscola o con _. name è un atomo e Name è una variabile, quindi un refuso in minuscolo cambia in silenzio il significato di una clausola.
  • Gli avvisi singleton indicano che una variabile compare una sola volta in una clausola, il che di solito è un refuso. Rinominala in _ o _Name se non è usata di proposito.
  • Usa il cut con attenzione. Il max/3 qui sopra va bene per max(3, 7, M), ma la seconda clausola dipende dal cut, quindi max(5, 3, 3) riesce erroneamente. Scrivere max(X, Y, Y) :- X < Y. come seconda clausola lo rende sicuro. Un cut messo nel punto sbagliato può anche nascondere soluzioni che findall altrimenti restituirebbe.
  • La ricorsione a sinistra va in loop. Una regola come ancestor(X, Y) :- ancestor(X, Z), parent(Z, Y). ricorre all'infinito. Metti per primo l'obiettivo parent.
Suggerimento: se main fallisce invece di riuscire, SWI-Prolog stampa un avviso che l'obiettivo di inizializzazione è fallito. Aggiungi chiamate a writeln/1 tra gli obiettivi per vedere fin dove arriva.

Domande frequenti

Come eseguo una query?

Scrivila dentro un predicato come main e aggiungi :- initialization(main). alla fine del file. Puoi anche mettere un obiettivo direttamente in una direttiva, ad esempio :- X is 2^10, writeln(X).

È Prolog standard?

È SWI-Prolog, che segue lo standard ISO e aggiunge molte estensioni. In SWI-Prolog il testo tra virgolette doppie è una stringa, il che conta se sei abituato a vederlo come una lista di codici di caratteri.

Posso ottenere tutte le risposte di una query?

Sì. Usa findall/3 per raccoglierle in una lista, oppure forall/2 per stamparle una per una, come fa il programma di esempio.

Sono disponibili altri linguaggi logici o funzionali?

Prova l'interprete Scheme online o il compilatore Clojure online, oppure guarda tutti i compilatori online.

Aggiornato

Copiato negli appunti