Einsteinrätsel Prolog

Neue Frage »

Auf diesen Beitrag antworten »
dark_inf Einsteinrätsel Prolog

Hallo, ich soll folgende Variante des Einstein-Rätsels in Prolog lösen:
In Hafen befinden sich fünf Schiffe. Ein Schiff kann jeweils nach Hamburg, Manila,
Marseille, Genua oder Port Said fahren (Zielort), die Fahne von England, Frankreich,
Griechenland, Brasilien oder Spanien tragen, mit Tee, Kaffee, Kakao, Reis oder Korn
beladen sein (Fracht), links oder rechts vom anderen Schiff im Hafen liegen (Position),
in Farbe schwarz, blau, grün, rot oder weiß gestrichen sein, und um 5, 6, 7, 8 oder 9 Uhr
abfahren.
Folgendes ist bekannt:
• das griechische Schiff fährt um 6 Uhr ab
• das griechische Schiff ist mit Kaffee beladen
• das in der Mitte stehende Schiff ist schwarz
• das englische Schiff fährt um 9 Uhr ab
• das französische Schiff ist blau
• das französische Schiff liegt links von dem Schiff, das Kaffee befördert
• rechts von dem Schiff mit Kakao ist das Schiff, das nach Marseille geht
• das brasilianische Schiff geht nach Manila
• das grüne Schiff ist neben einem Schiff, das mit Reis beladen ist
• das Schiff nach Genua fährt um 5 ab
• das spanische Schiff fährt um 7 ab
• das spanische Schiff ist rechts von einem Schiff, das nach Marseille geht
• das rote Schiff geht nach Hamburg
• das weiße Schiff ist neben einem Schiff, das um 7 losfährt
• ein Schiff am Rand (also: äußerst links oder rechts) ist mit Korn beladen
• das schwarze Schiff fährt um 8 ab
• das Schiff mit Korn liegt neben einem Schiff mit Reis
• das Schiff nach Hamburg fährt um 6 ab.
Welches Schiff ist mit Tee beladen? Welches Schiff fährt nach Port Said?

Ich habe bis jetzt folgendes, was irgendwie zu keiner Lösung führt:

% Schiffe sind Listen von der Form [Zielort, Fahne, Fracht, Farbe, Abfahrt]

% Hilfsprädikate
mittleres(M,[_,_,M,_,_]).
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).
erstes(E,[E|_]).
letztes(L,[_|L]).
rand(R) :- erstes(R);letztes(R).

% Informationen verarbeiten
loese :-
X = [_,_,_,_,_],
member([_,Griechenland,_,_,6],X),
member([_,Griechenland,Kaffee,_,_],X),
mittleres([_,_,_,Schwarz,_],X),
member([_,England,_,_,9],X),
member([_,Frankreich,_,Blau,_],X),
links([_,Frankreich,_,_,_],[_,_,Kaffee,_,_],X),
links([_,_,Kakao,_,_],[Marsaille,_,_,_,_],X),
member([Manila,Brasilien,_,_,_],X),
neben([_,_,_,Gruen,_],[_,_,Reis,_,_],X)
member([Genua,_,_,_,5],X),
member([_,Spanien,_,_,7],X),
links([Marsaille,_,_,_,_],[_,_,Spanien,_,_],X),
member([Hamburg,_,_,Rot,_],X),
neben([_,_,_,Weiss,7],[_,_,_,_,_],X),
rand([_,_,Korn,_,_],X),
member([_,_,_,Schwarz,8],X),
neben([_,_,Korn,_,_],[_,_,Reis,_,_],X),
member([Hamburg,_,_,_,6],X).
 
Auf diesen Beitrag antworten »
Karlito

Hallo,

habe zwar Logik bestanden, aber keinerlei Erfahrung mit einer Logikprogrammiersprache, da bei uns mehr Wert auf Beweise gelegt wurde, als auf die Anwendung. Bin mir also nicht sicher ob ich Dir helfen kann, da die Zeit, die mir momentan zur Verfügung steht sehr begrenzt ist.

Ich denke mal, wenn ich bis Sonntag nichts gepostet habe, wird das auch nichts mehr... Sorry.

VG,

Karlito
Auf diesen Beitrag antworten »
dark_inf

alles klar, aber schon mal vielen dank für die mühe smile
Auf diesen Beitrag antworten »
Karlito

Was mir als erstes auffällt ist, dass "rand" sich nicht auf eine Liste bezieht. Du forderst auch bei "erstes" und "letztes" die Liste, rufst es dann aber nicht in rand entsprechend auf. Vlt war es das ja schon?

VG,

Karlito
 
Auf diesen Beitrag antworten »
Karlito

OK, erste Erkenntnisse:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
% Schiffe sind Listen von der Form [Zielort, Fahne, Fracht, Farbe, Abfahrt]

% Hilfsprädikate
mittleres(M,[_,_,M,_,_]).
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).
erstes(E,[E|_]).
letztes(L,[_|L]).
rand(R,L) :- erstes(R,L);letztes(R,L).

% Informationen verarbeiten
loese :-
X = [_,_,_,_,_],
member([_,Griechenland,_,_,6],X),
member([_,Griechenland,Kaffee,_,_],X),
mittleres([_,_,_,Schwarz,_],X),
member([_,England,_,_,9],X),
member([_,Frankreich,_,Blau,_],X),
links([_,Frankreich,_,_,_],[_,_,Kaffee,_,_],X),
links([_,_,Kakao,_,_],[Marsaille,_,_,_,_],X),
member([Manila,Brasilien,_,_,_],X),
neben([_,_,_,Gruen,_],[_,_,Reis,_,_],X),
member([Genua,_,_,_,5],X),
member([_,Spanien,_,_,7],X),
links([Marsaille,_,_,_,_],[_,_,Spanien,_,_],X),
member([Hamburg,_,_,Rot,_],X),
neben([_,_,_,Weiss,7],[_,_,_,_,_],X),
rand([_,_,Korn,_,_],X),
member([_,_,_,Schwarz,8],X),
neben([_,_,Korn,_,_],[_,_,Reis,_,_],X),
member([Hamburg,_,_,_,6],X).


Du hast in Zeile 24 das Komma am Ende der Zeile vergessen. Weiterhin wie angesprochen die Klausel "rand" habe ich mal geändert. So kompiliert das Programm schonmal.

Edit: In Zeile 26 steht Spanien an der falschen Stelle.

Jetzt darfst du wieder. Es fehlen noch die Ausgaben und mal sehen was noch Augenzwinkern

Edit: Die Listenelemente sind, wenn ich es richtig in Erinnerung habe, Konstanten. Prolog versteht scheinbar groß geschriebene Begriffe als Variablen. D.h. Du musst alle Listenelemente noch klein schreiben.

VG,

Karlito
Auf diesen Beitrag antworten »
dark_inf

habe es jetzt zu folgendem geändert, kann es aber mit dem aufruf "run." immer noch nicht lösen:
<p style="margin-top: 0">[/align]
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 
% Schiffe sind Listen von der Form [Zielort, Fahne, Fracht, Farbe, Abfahrt]

% Hilfsprädikate
mittleres(M,[_,_,M,_,_]).
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).
erstes(E,[E|_]).
letztes(L,[_|L]).
rand(R,L) :- erstes(R,L);letztes(R,L).

% Informationen verarbeiten
loese :-
X = [_,_,_,_,_], % 5 Schiffe nebenenander
member([_,griechenland,_,_,6],X), % das griechische Schiff fährt um 6 Uhr ab
member([_,griechenland,kaffee,_,_],X), % das griechische Schiff ist mit kaffee beladen
mittleres([_,_,_,schwarz,_],X), % das in der Mitte stehende Schiff ist schwarz
member([_,england,_,_,9],X), % das englische Schiff fährt um 9 Uhr ab
member([_,frankreich,_,blau,_],X), % das französische Schiff ist blau
links([_,frankreich,_,_,_],[_,_,kaffee,_,_],X), % das französische Schiff liegt links von dem Schiff, das kaffee befördert
links([_,_,kakao,_,_],[marsaille,_,_,_,_],X), % rechts von dem Schiff mit Kakao ist das Schiff, das nach Marseille geht
member([manila,brasilien,_,_,_],X), % das brasilianische Schiff geht nach Manila
neben([_,_,_,gruen,_],[_,_,reis,_,_],X), % das grüne Schiff ist neben einem Schiff, das mit Reis beladen ist
 
Auf diesen Beitrag antworten »
Karlito

Wenn du das Lösungsprädikat loese nennst, solltest du auch nach loese fragen (und nicht nach run.)...

VG,

Karlito
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »