So nutzen Sie den Online-Prolog-Compiler
- Schreiben Sie Ihre Fakten und Regeln in den Editor oder beginnen Sie mit dem Beispiel über Beispiel zurücksetzen.
- Legen Sie fest, was ausgeführt wird: mit einer Direktive
:- initialization(main)., wobeimainein Prädikat ist, das die gewünschten Ziele aufruft und die Ergebnisse ausgibt. - Drücken Sie Ausführen oder nutzen Sie Strg + Enter (⌘ + Enter auf dem Mac). Das Programm wird als Datei
main.plgeladen, und seine Direktiven laufen beim Laden. - Im Bereich Ausgabe sehen Sie ausgegebenen Text, Fehler und Warnungen. Wählen Sie ein Zeitlimit von 5, 15 oder 60 Sekunden und nutzen Sie Stopp, wenn eine Rekursion nie endet.
Die SWI-Prolog-Laufzeitumgebung ist etwa 4 MB groß und wird nach dem ersten Besuch von Ihrem Browser zwischengespeichert. Sichern Sie Ihr Programm mit Kopieren oder dem Download main.pl, ändern Sie die Textgröße mit A− und A+, wechseln Sie die Anordnung der Bereiche mit der Layout-Schaltfläche und nutzen Sie Vollbild (Strg/⌘ + Umschalt + F, mit Esc beenden) für längere Programme.
Alles läuft in Ihrem Browser. Das Programm wird nie an einen Server gesendet, und der Editor speichert Ihre letzte Version nur im lokalen Speicher Ihres Browsers.
Was unterstützt wird
Die Seite nutzt SWI-Prolog 10, kompiliert zu WebAssembly (swipl-wasm). Es ist das echte SWI-Prolog-System und kein vereinfachter Interpreter.
- Laden einer Datei: Ihr Code wird genau so geladen, wie es
consult('main.pl')täte, daher funktionieren Klauseln, Operatoren und Direktiven. - Ausgabeprädikate:
format/2,write/1,writeln/1,print/1undnl/0geben alle im Ausgabebereich aus. - Listen- und Alle-Lösungen-Prädikate:
member/2,append/3,length/2,msort/2,findall/3,bagof/3,setof/3,forall/2. - Arithmetik mit
is/2und den Vergleichsoperatoren, für Ganzzahlen und Gleitkommazahlen. Die Fakultät20!aus dem Beispiel wird exakt berechnet. - Diagnosemeldungen, wie SWI-Prolog sie ausgibt, zum Beispiel Warnungen zu Singleton-Variablen und Fehler wie
ERROR: ... Arithmetic: `foo/0' is not a function.
Was sich von einem Desktop-Prolog unterscheidet:
- Es gibt keine interaktive
?--Abfrageaufforderung, Sie können also keine Anfragen eintippen und mit;weitere Antworten anfordern. Setzen Sie die Anfragen inmainund geben Sie die Antworten aus oder sammeln Sie alle mitfindall/3oderforall/2. - Keine Standardeingabe.
read/1hat nichts zu lesen; schreiben Sie Ihre Testdaten daher als Fakten.
Prolog-Grundlagen in einem Programm
% Fakten
likes(mary, wine).
likes(john, wine).
likes(john, mary).
% Eine Regel: X und Y sind befreundet, wenn beide dasselbe mögen
friends(X, Y) :- likes(X, Z), likes(Y, Z), X \== Y.
% Rekursion über eine Liste, mit einem Akkumulator
sum_list_acc([], Acc, Acc).
sum_list_acc([H|T], Acc0, Sum) :- Acc1 is Acc0 + H, sum_list_acc(T, Acc1, Sum).
% Der Cut (!) legt sich auf die erste passende Klausel fest
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).
Beim Ausführen werden [mary-john,john-mary], sum = 10 und max = 7 ausgegeben.
Häufige Stolperfallen
=ist Unifikation, keine Zuweisung und keine Arithmetik.X = 1 + 2bindetXan den Term1+2. Verwenden SieX is 1 + 2, um ihn auszuwerten, und=:=, um zwei Zahlen zu vergleichen.- Variablen beginnen mit einem Großbuchstaben oder
_.nameist ein Atom undNameist eine Variable; ein Tippfehler in der Groß-/Kleinschreibung ändert daher stillschweigend die Bedeutung einer Klausel. - Singleton-Warnungen bedeuten, dass eine Variable in einer Klausel nur einmal vorkommt, was meist ein Tippfehler ist. Benennen Sie sie in
_oder_Nameum, wenn sie absichtlich ungenutzt ist. - Setzen Sie den Cut mit Bedacht ein. Das obige
max/3ist fürmax(3, 7, M)in Ordnung, aber die zweite Klausel hängt vom Cut ab, sodassmax(5, 3, 3)fälschlich erfolgreich ist. Mitmax(X, Y, Y) :- X < Y.als zweiter Klausel wird es sicher. Ein falsch platzierter Cut kann auch Lösungen verbergen, diefindallsonst zurückgeben würde. - Linksrekursion läuft endlos. Eine Regel wie
ancestor(X, Y) :- ancestor(X, Z), parent(Z, Y).rekursiert ohne Ende. Setzen Sie das Zielparentan den Anfang.
main fehl, statt erfolgreich zu sein, gibt SWI-Prolog eine Warnung aus, dass das Initialisierungsziel fehlgeschlagen ist. Fügen Sie zwischen den Zielen writeln/1-Aufrufe ein, um zu sehen, wie weit es kommt.Häufig gestellte Fragen
Wie führe ich eine Abfrage aus?
Schreiben Sie sie in ein Prädikat wie main und fügen Sie am Ende der Datei :- initialization(main). hinzu. Sie können ein Ziel auch direkt in eine Direktive setzen, zum Beispiel :- X is 2^10, writeln(X).
Ist das Standard-Prolog?
Es ist SWI-Prolog, das dem ISO-Standard folgt und viele Erweiterungen ergänzt. Text in doppelten Anführungszeichen ist in SWI-Prolog ein String, was wichtig ist, wenn Sie gewohnt sind, dass er eine Liste von Zeichencodes bedeutet.
Kann ich jede Antwort auf eine Abfrage erhalten?
Ja. Nutzen Sie findall/3, um sie in einer Liste zu sammeln, oder forall/2, um jede einzeln auszugeben, wie es das Beispielprogramm tut.
Gibt es andere logische oder funktionale Sprachen?
Probieren Sie den Online-Scheme-Interpreter oder den Online-Clojure-Compiler oder sehen Sie sich alle Online-Compiler an.
Aktualisiert
Kommentare
Melden Sie sich an, um dieses Tool zu bewerten.
Teilen Sie einen Tipp, stellen Sie eine Frage oder erzählen Sie, wie das Tool bei Ihnen funktioniert hat.
Noch keine Kommentare. Erzählen Sie als Erste oder Erster, wie es lief.