Prolog Code ausführen?

Ich habe für das Einstein-Rätsel einen Quellcode in Prolog gefunden:

http://www.logisch-gedacht.de/logikraetsel/einsteinr…

ich habe auch SWI Prolog installiert und mit einfachen beispielen getestet. Nur habe ich keine ahnung wie man das Programm dazu bringen soll den Code „auszuführen“… Nachdem der Code consultiert wird, passiert da garnichts. Kann mir da jemand helfen?

In Prolog wird Code – wie in allen deklarativen Programmiersprachen – immer mit einer bestimmten Anfrage (engl. query) ausgeführt und liefert dann eine von der Anfrage abhängige Antwort (engl. reply).

Beispiel:
legt_eier(frosch).
legt_eier(huhn).
weiss(huhn).
weiss(eisbaer).

Anfrage:
weiss(X), legt_eier(X).

Antwort:
X = huhn.

Das Programm zum Einsteinrätsel (aus dem Link) ist so aufgebaut, dass zunächst einige Hilfprädikate definiert werden (leftof/3, nextto/3, first/2, inthemiddle/2), und das Rätsel dann in einem einzigen Prädikat (einstein/0) codiert wird.

Zum Ausführen genügt dementsprechend die Anfrage „einstein.“. (An den Punkt am Ende denken.)

Die Eingaben:
-einstein.
-einstein.pl.
-„einstein.pl“.

führten leider nicht zur Ausführung der „anwendung“.

habe es aber rein aus verzweiflung mal mit „run.“ probiert, und es hat funktioniert!

Danke für den Denkstoß!

Was genau meinst du mit „Nachdem der Code consultiert wird“? Das Programm enthält genau eine Ausgabe. Die solltest du zu sehen bekommen. Sonst macht es nichts weiter.

Hi,

nach dem Prompt einfach einstein eingeben, um
das Ziel Einstein zu starten.
Einstein wird ohne Parameter aufgerufen, ich weiss
gerade nicht ob SWI dann leere Klammern erwartet.

Probier also mal aus entweder

-? einstein.

oder

-? einstein().

Wichtig ist der kleine Buchstabe am Anfang,
Grssbuchstaben kennzeichnen in Prolog Variablen.

Prolog antwortet dann mit einer der folgenden Möglichkeiten:

  • dem AntwortText aus der write Anweisung falls eine Lösung gefunden wurde

  • No, falls keine Lösung gefunden wurde

  • Einer Fehlermeldung …

Gruss,
Thilo

Hallo!

Es sollte genügen, einfach

einstein.

an der Eingabeaufforderung einzugeben.

SWI Prolog ist eine Windows Anwendung und den befehl „einstein.“ habe ich auf dem konsolenfenster des programms (keine herkömmliche dos-eingabeaufforderung) schon ausprobiert. Jedenfalls hat es sich erledigt nachdem es mit „run.“ funktioniert hat.

Ps: war meine erste frage auf dieser seite. Bin positiv überrascht über die schnelle hilfe… danke an alle!

Falls es nicht am Programm liegt, mit STARTEN

  1. Neu starten
  2. ALLE CONSULTIEREN
    Dann hinter dem Fragezeichen Abfrage formulieren
    Hajo

Starte SWI-Prolog. Wechsle in das verzeichnis, in dem du die einstein.pl abgespeichert hast. Dann 3. und 4. eingeben und mit ENTER bestätigen. Den PUNKT am Zeilenende darfst du nicht vergessen. Viel Spaß mit Prolog!

3 ?- consult(‚einstein.pl‘).
% einstein.pl compiled 0.00 sec, 508 bytes
true.

4 ?- einstein.
Der deutsche haelt den Fisch.
true.

Ich möchte meine „kredite“ hier zwar nicht ausschöpfen, aber während der Abarbeitung bin ich auf ein anderes Problem gestoßen.

Ich habe versucht ein anderes Einstein Problem in Prolog zu Codieren worin auch Negationen wie „A sitzt nicht neben B“ vorkommen.

Als Hilfsprädikate habe ich die gleichen verwendet die auch im angegebenen Link vorkommen. Also:

links(A,B,[A|[B|\_]]).
links(A,B,[_|R]):-links(A,B,R).
neben(A,B,L):-links(A,B,L);links(B,A,L).

Demnach habe ich Aussagen wie:
„Der Herr im Hemd saß nicht neben dem Herrn mit der Weste“

Codiert als:
neben([_,hemd,_],[_,not(weste),_],X),

Dies scheint zwar syntaktisch korrekt zu sein, da der Compiler keinen Fehler ausgibt, aber Logisch falsch da nur ein „false“ ausgegeben wird wenn es ausgeführt wird.

Wie ich die Negation „nicht neben“ anders darstellen könnte fällt mir leider nicht ein. Kann mir vielleicht jemand weiterhelfen?

Den gesamten Code (25 Zeilen) gibt es hier:
http://uploaded.to/file/ezjmoh

sorry, mag jetzt nicht gerne „programmieren“… bin gerade im urlaub…

ich hatte auch übersehen dass meine antwort nur an dich weitergeleitet wird… werde wohl eine neue anfrage erstellen müssen :smile: