Come usare il compilatore Prolog online
- Scrivi i tuoi fatti e le tue regole nell'editor, oppure parti dall'esempio con Ripristina esempio.
- Indica cosa eseguire con una direttiva
:- initialization(main)., dovemainè un predicato che chiama gli obiettivi (goal) che vuoi provare e stampa i risultati. - Premi Esegui oppure usa Ctrl + Invio (⌘ + Invio su Mac). Il programma viene caricato come file
main.ple le sue direttive vengono eseguite durante il caricamento. - 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/1enl/0stampano 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/2e gli operatori di confronto, su interi e numeri in virgola mobile. Il20!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 inmaine stampa le risposte, oppure raccoglile tutte confindall/3oforall/2. - Nessuno standard input.
read/1non 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 + 2legaXal termine1+2. UsaX is 1 + 2per valutarlo e=:=per confrontare due numeri.- Le variabili iniziano con una lettera maiuscola o con
_.nameè un atomo eNameè 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_Namese non è usata di proposito. - Usa il cut con attenzione. Il
max/3qui sopra va bene permax(3, 7, M), ma la seconda clausola dipende dal cut, quindimax(5, 3, 3)riesce erroneamente. Scriveremax(X, Y, Y) :- X < Y.come seconda clausola lo rende sicuro. Un cut messo nel punto sbagliato può anche nascondere soluzioni chefindallaltrimenti 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'obiettivoparent.
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