HSG |
|
aus: Die Rheinpfalz, Nr. 54, vom Samstag, 5.März 2005
Diese Denksportaufgabe wird Albert Einstein zugeschrieben, Beweise für seine Autorenschaft fanden wir jedoch nicht. Spaß macht es auf jeden Fall, sie zu lösen. Man muss nicht einmal die Relativitätstheorie verstanden haben - logisches Denken genügt.
Fünf Männer wohnen in fünf nebeneinander liegenden Häusern unterschiedlicher Farbe. Sie haben unterschiedliche Geschmacksvorlieben bei Speisen und Getränken und halten unterschiedliche Haustiere.
Welche Nationalität hat derjenige, der einen Goldfisch hält?
Legen Sie sich eine Tabelle mit fünf Spalten und fünf Zeilen an. Tragen Sie untereinander ein: Nationalität, Hausfarbe, Lieblingsessen, Getränk, Tier. In die Spalten setzen Sie die nebeneinander liegenden Häuser. Versuchen Sie nun, durch logische Verknüpfung der Angaben die Tabelle auszufüllen. (kwi)
Ein Prolog-Programm zur Lösung könnte ähnlich wie in einem Programm von Andrea Pfreundt, Lk 12, Abitur 2006, so aussehen:
nr(1). nr(2). nr(3). nr(4). nr(5). bedingungen(A,B,C,D,E):-nr(A),nr(B),nr(C),nr(D),nr(E), A\=B,A\=C,A\=D,A\=E,B\=C,B\=D,B\=E,C\=D,C\=E,D\=E. loesung(Norweger,Englaender,Daene,Deutscher,Schwede, Rot,Gruen,Weiss,Gelb,Blau, Tee,Milch,Wasser,Bier,Kaffee, Pizza,Schokolade,Fisch,Bockwurst,Pommes, Katze,Voegel,Hunde,Pferde,Goldfisch):- bedingungen(Norweger,Englaender,Daene,Deutscher,Schwede), bedingungen(Rot,Gruen,Weiss,Gelb,Blau), bedingungen(Tee,Milch,Wasser,Bier,Kaffee), bedingungen(Pizza,Schokolade,Fisch,Bockwurst,Pommes), bedingungen(Katze,Voegel,Hunde,Pferde,Goldfisch), Norweger=1, Englaender=Rot, Daene=Tee, Gruen+1=:=Weiss, abs(Pizza-Katze)=:=1, Gelb=Schokolade, Deutscher=Fisch, Milch=3, abs(Pizza-Wasser)=:=1, Bockwurst=Voegel, Schwede=Hunde, abs(Norweger-Blau)=:=1, Pommes=Bier, abs(Pferde-Gelb)=:=1, Gruen=Kaffee.
Leider hat das Programm eine so lange Laufzeit, dass man es wohl entnervt abbricht. Das folgende Programm wurde - auch wieder nach der Vorlage von Andrea Pfreundt - in der Richtung optimiert, dass versucht wurde, Misserfolge möglichst früh zu erkennen:
/* Gesucht werden passende Hausnummern 1..5 für 25 Variablen. So bedeutet etwa Norweger=1, dass der Norweger im ersten Haus wohnt. */ nr(1). nr(2). nr(3). nr(4). nr(5). bedingungen(A,B,C,D,E):-nr(A),nr(B),A\=B,nr(C),A\=C,B\=C,nr(D),A\=D,B\=D,C\=D, nr(E),A\=E,B\=E,C\=E,D\=E. loesung(Norweger,Englaender,Daene,Deutscher,Schwede, Rot,Gruen,Weiss,Gelb,Blau, Tee,Milch,Wasser,Bier,Kaffee, Pizza,Schokolade,Fisch,Bockwurst,Pommes, Katze,Voegel,Hunde,Pferde,Goldfisch):- Norweger is 1, % abs(Norweger-Blau)=:=1, Blau is 2, Milch is 3, bedingungen(Rot,Gruen,Weiss,Gelb,Blau), Gruen+1=:=Weiss, bedingungen(Norweger,Englaender,Daene,Deutscher,Schwede), Englaender=Rot, bedingungen(Tee,Milch,Wasser,Bier,Kaffee), Daene=Tee, Gruen=Kaffee, bedingungen(Pizza,Schokolade,Fisch,Bockwurst,Pommes), Gelb=Schokolade, Deutscher=Fisch, Pommes=Bier, bedingungen(Katze,Voegel,Hunde,Pferde,Goldfisch), abs(Pizza-Katze)=:=1, abs(Pizza-Wasser)=:=1, Bockwurst=Voegel, Schwede=Hunde, abs(Pferde-Gelb)=:=1.
Tatsächlich findet das Programm sehr schnell eine Lösung. Was fehlt ist eine komfortable Ausgabe. Diese wird vom folgenden (verbesserungswürdigen?) Programmteil erledigt:
a(L):-loesung(N1,N2,N3,N4,N5,F1,F2,F3,F4,F5,G1,G2,G3,G4,G5, E1,E2,E3,E4,E5,T1,T2,T3,T4,T5), loesung(N1,N2,N3,N4,N5,F1,F2,F3,F4,F5,G1,G2,G3,G4,G5, E1,E2,E3,E4,E5,T1,T2,T3,T4,T5)=..[_|L]. liste([norweger,englaender,daene,deutscher,schwede,rot,gruen,weiss,gelb,blau, tee,milch,wasser,bier,kaffee,pizza,schokolade,fisch,bockwurst,pommes, katze,voegel,hunde,pferde,goldfisch]). /* aus geht die Liste L1 durch und gibt immer, wenn man auf E trifft, das an der gleichen Stelle in L2 stehende Element aus */ aus(L1,E,L2):-write(E),write(': '),aus(L1,0,E,L2). aus([],N,E,L2). aus(L1,N,E,L2):-N1 is N+1,L1=[K|R],K=E,nth0(N,L2,A), write(A),write(', '),aus(R,N1,E,L2). aus(L1,N,E,L2):-N1 is N+1,L1=[K|R],K\=E,aus(R,N1,E,L2). ausgabe:-liste(L1),a(L2),aus(L2,1,L1),nl,aus(L2,2,L1),nl,aus(L2,3,L1),nl, aus(L2,4,L1),nl,aus(L2,5,L1),nl.
Die Ausgabe lautet dann schließlich:
?- ausgabe. 1: norweger, gelb, wasser, schokolade, katze, 2: daene, blau, tee, pizza, pferde, 3: englaender, rot, milch, bockwurst, voegel, 4: deutscher, gruen, kaffee, fisch, goldfisch, 5: schwede, weiss, bier, pommes, hunde,