Wie fängt man einen Löwen in der Wüste ?
Mathematische Methoden:
1. Die Hilbertsche oder axiomatische Methode. Man stellt einen Käfig in die Wüste und führt folgendes
Axiomensystem ein:
Axiom 1:
Die Menge der Löwen in der Wüste ist nicht leer.
Axiom 2:
Sind Löwen in der Wüste, so ist auch ein Löwe im Käfig.
Schlußregel: Ist p ein richtiger Satz, und gilt "wenn p, so q", so ist auch q ein richtiger Satz.
Satz: Es ist ein Löwe im Käfig.
2. Die geometrische Methode. Man stelle einen zylindrischen Käfig in die Wüste.
1 Fall:
Der Löwe ist im Käfig. Dieser Fall ist trivial.
2 Fall:
Der Löwe ist außerhalb des Käfigs. Dann stelle man sich in den Käfig und mache eine Inversion an den
Käfigwänden. Auf diese Weise gelangt der Löwe in den Käfig und man selbst nach draußen :-).
Achtung: Bei Anwendung dieser Methode ist dringend darauf zu achten, daß man sich nicht auf den Mittelpunkt des
Käfigbodens stellt, da man sonst im Unendlichen verschwindet.
3. Die Bolzano-Weierstraß-Methode. Wir halbieren die Wüste in Nord-Süd Richtung durch einen Zaun. Dann ist der
Löwe entweder in der westlichen oder östlichen Hälfte der Wüste. Wir wollen annehmen, daß er in der westlichen Hälfte
ist. Daraufhin halbieren wir diesen westlichen Teil durch einen Zaun in Ost-West Richtung. Der Löwe ist entweder im
nörlichen oder im südlichen Teil. Wir nehmen an, er ist im nördlichen. Auf diese Weise fahren wir fort. Der Durchmesser
der Teile, die Bei dieser Halbiererei entstehen, strebt gegen Null. Auf diese Weise wird der Löwe schließlich von einem
Zaun beliebig kleiner Länge eingegrenzt.
Achtung: Bei dieser Methode achte man darauf, daß das schöne Fell des Löwen nicht beschädigt wird.
4. Die funktionalanalytische Methode. Die Wüste ist ein separabler Raum. Er enthält daher eine abzählbar dichte
Menge, aus der eine Folge ausgewählt werden kann, die gegen den Löwen konvergiert. Mit einem Käfig auf dem
Rücken, springen wir von Punkt zu Punkt dieser Folge und nähern uns so dem Löwen beliebig genau.
5. Die topologische Methode. Der Löwe kann topologisch als Torus aufgefaßt werden. Man transportiere die die Wüste
in den vierdimensionalen Raum. Es ist nun möglich die Wüste so zu deformieren, daß beim Rücktransport in den
dreidimensionalen Raum der Löwe verknotet ist. Dann ist er hilflos.
6. Die Banachsche oder iterative Methode. Es sei f eine Kontraktion der Wüste in sich mit Fixpunkt x0. Auf diesen
Fixpunkt stellen wir den Käfig. Durch sukzessive Iteration
W(n+1) = f (W(n)), n=0,1,2,... ( W(0)=Wüste )
wird die Wüste auf den Fixpunkt zusammengezogen. So gelangt der Löwe in den Käfig.
7. Die mathematisch-statistische Methode:
Satz 1: Die Anzahl der Sandkörner in der Wüste ist endlich.
Satz 2: Es existiert wenigstens ein Sandkorn auf dem der Löwe sitzt.
Problemlösungsprozeß: Man lege jedes Sandkorn in den Käfig. -> sind alle Sandkörner im Käfig, so ist auch der
Löwe im Käfig.
8. mathematisch-zeitliche Methode: Man warte undendlich lange. Nach unendlich langer Zeit ist der Löwe tot. Wir
suchen seine Gebeine und legen sie in den Käfig. (In der Problemspezifikation ist kein Wort von einem lebendigem
Löwen die Rede)
Physikalische Methoden:
1.Die Newtonsche Methode. Käfig und Löwe ziehen sich durch die Gravitationskraft an. Wir vernachlässigen die
Reibung. Auf diese Weise muß der Löwe früher oder später am Käfig landen.
2.Die Heisenberg-Methode. Ort und Geschwindigkeit eines bewegten Löwen lassen sich nicht gleichzeitig bestimmen.
Da bewegte Löwen also keinen physikalisch sinnvollen Ort in der Wüste einnehmen, kommen sie für die Jagd nicht in
Frage. Die Löwenjagd kann sich daher nur auf ruhende Löwen beschränken. Das Einfangen eines ruhenden,
bewegungslosen Löwen wird dem Leser als übungsaufgabe überlassen.
3.Die Einsteinsche oder relativistische Methode. Man überfliege die Wüste mit Lichtgeschwindigkeit. Durch die
relativistische Längenkontraktion wird der Löwe flach wie Papier. Man greife ihn, rolle ihn auf und mache ein
Gummiband herum.
KI-Methode:
suche(Löwe,Wüste,_) :- var(Wüste),!,fail.
% In einer nicht instantiierten W"uste
% lassen sich keine L"owen fangen.
suche(Löwe,Wüste,Wüste) :- atomic(Wüste), gefunden(Löwe,Wüste).
% Wenn die W"uste atomar ist,
% mu"s dort der L"owe sein.
suche(Löwe,[],_):- !, fail.
% Wenn die W"uste leer ist, ist auch
% kein L"owe drin.
suche(Löwe,[HEAD],HEAD) :- gefunden(Löwe,HEAD).
% Wenn der L"owe im ersten Element
% der W"uste ist, dann fertig.
suche(Löwe,[_|T],X) :- suche(Löwe,T,X).
% Sonst weiter schauen.
fange(Was,Wo,Womit) :-
fange(Was,Wo,WoGenau),
bewege(Womit,WoGenau).
gefunden(Was,Worin) :- member(Was, Worin).
bewege(Was, _ ) :- retract(position(Was,_)), fail.
bewege(Was,Wohin) :- asserta(position(Was,Wohin)).
test_Wüste([Wüste_1, Wüste_2, Wüste_3, Wüste_4, Wüste_5,
Wüste_6, Wüste_7, [Wüste_8, Löwe], Wüste_9,
Wüste_A, [Wüste_B, wagen], Wüste_C, Wüste_D]).
fange_Löwe_test :-
bewege(Käfig,wagen),
test_Wüste(Wüste),
fange(Löwe,Wüste,Käfig).
Iterative Methoden
! Geeignete Datenstrukturen werden vorrausgesetzt !
1. Als Standardlösung ist immer zu empfehlen:
MODULE Fang;
FROM Problem IMPORT Loesung;
BEGIN;
Loesung;
END Fang.
2. Auch in ASM (MS-DOS) ist es möglich (ab MASM 9.0 oder TASM 4.5):
dosseg
.DATA
MAX equ 65535
Wüsten_Feld db MAX dup (0)
Käfig db
extern Löwe_Fkt_Nummer:Word ; DOS-Int. Nummer
.CODE
lds si, W_Feld ; ES:DI zeigt auf Anfang des Feldes
cld
mov CX,MAX ; CX als max. Index
M1:
lodsb
cmp al,Löwe
je Gefangen
loop M1
jmp Error
Gefangen:
mov BX,SI
mov AX,Löwe_Fkt_Nummer
lds di, Käfig
int 21h ; Dos-Interrupt, da alle aufwendigen Proc. in
; ASM ausgelagert werden sollen.
Error:
int 20h
END
3. Die einzigste wahrhaftige Lösung , die wirklich funktioniert , ist in der genialen Umgebung des LPC, das man
in UNItopia bewundern kann. /* Ist ein Multi-User-Textadventures, geschrieben in C++-Clone. */ { Werbung
: einloggen unter telnet 129.69.221.120 3333 und spielen }
int fang(string str)
{ object ob1,ob2,ob3;
if (!str || str!="Löwe mit Käfig")
{ write("WEN willst du mit WAS fangen ?\n");
return 1;
}
ob1=clone_object("/obj/Wüste"); /* Wüste enthält Löwe s.Aufgabe */
ob2=clone_object("/obj/Käfig");
if (!ob3=present("Löwe",ob1)
{ write("Es ist kein Löwe in der Wüste !\n"); /* Falls weggerannt */
return 1;
}
ob3->move(ob2);
write("Der Löwe befinde sich jetzt im Käfig.\n");
return 1;
}
Diese Funktion muß noch an ein Ereignis angehängt werden, die Objekte
Käfig.c und Wüste.c sind geeignet zu implementieren.
4. In Turbo Pascal geht dieses Problem natürlich auch:
program Test_Loesung;
type Wüster_Typ= Array[1..Max_X,1..Max_Y] of Index;
Inhalt = { weiß nicht }
Käfig_Typ = record
voll : Boolean;
Inhalt : Tier;
end;
Löwen_Typ = Tier;
var Wüste : Wüster_Typ;
Käfig : Käfig_Typ;
Tiere : Array[1..Max_Tiere] of Tier; { Falls noch Kamele in der Wüste }
{ sind . }
procedure Löwen_Fang;
var i,j:Word;
begin;
Käfig.voll:=false;
for i:=1 to Max_X do { Wüste nach Löwe absuchen }
for j:=1 to Max_Y do
if Wüste[i,j]=LöweN_INDEX then begin;
Käfig.Inhalt:=Tiere[Wüste[i,j]];
Käfig.voll:=true;
Wüste[i,j]:=KEINER_INDEX;
exit; { Da der Käfig schon voll }
end; { ist.Man könnte aber auch }
{ mit dieser Procedure alle Löwen einfangen. }
WriteLn('Achtung ! Kein Löwe gefunden, wie wärs mit einem Kamel ?');
end;
begin;
Init; { Wüste, Tiere werden eingestellt. }
Löwen_Fang;
if (Käfig.voll) then WriteLn(' Ok,der Löwe ist im Käfig.')
else WriteLn('Achtung ! Kein Löwe gefunden, durch "+
'Abänderung in KAMEL_INDEX wäre vielleicht"+
#10#13'ein Kamel möglich ?');
end.
5. Sogar als Shellscript geht es schon:
#!/bin/sh
for $tier in $Wüste
do
if [ $tier = $Löwe ]
then mv $tier $Käfig; exit 0
fi
done
Methode der Telekom:
Man benötigt dazu nur eine Telefonzelle und eine Fahradklingel. Die Telefonzelle wird in der Wüste aufgestellt und man klingelt
mit der Fahradklingel. Der Löwe hört das Klingeln, will ans Telefon und wenn er die Zelle betreten hat, muß man nur noch die
Tür verschließen.
Methode von Herlitz:
Man benötigt hierfür nur ein Notizblock der entsprechenden Firma. Damit setzt man sich auf eine Palme und wartet bis der
Löwe sich unter diese legt. Nun zerreißt man den Notizblock und und läßt die Papierschnitzel auf den Löwen regnen. Der
denkt es schneit und erfiert.
Mathematische Methoden:
1. Die Hilbertsche oder axiomatische Methode. Man stellt einen Käfig in die Wüste und führt folgendes
Axiomensystem ein:
Axiom 1:
Die Menge der Löwen in der Wüste ist nicht leer.
Axiom 2:
Sind Löwen in der Wüste, so ist auch ein Löwe im Käfig.
Schlußregel: Ist p ein richtiger Satz, und gilt "wenn p, so q", so ist auch q ein richtiger Satz.
Satz: Es ist ein Löwe im Käfig.
2. Die geometrische Methode. Man stelle einen zylindrischen Käfig in die Wüste.
1 Fall:
Der Löwe ist im Käfig. Dieser Fall ist trivial.
2 Fall:
Der Löwe ist außerhalb des Käfigs. Dann stelle man sich in den Käfig und mache eine Inversion an den
Käfigwänden. Auf diese Weise gelangt der Löwe in den Käfig und man selbst nach draußen :-).
Achtung: Bei Anwendung dieser Methode ist dringend darauf zu achten, daß man sich nicht auf den Mittelpunkt des
Käfigbodens stellt, da man sonst im Unendlichen verschwindet.
3. Die Bolzano-Weierstraß-Methode. Wir halbieren die Wüste in Nord-Süd Richtung durch einen Zaun. Dann ist der
Löwe entweder in der westlichen oder östlichen Hälfte der Wüste. Wir wollen annehmen, daß er in der westlichen Hälfte
ist. Daraufhin halbieren wir diesen westlichen Teil durch einen Zaun in Ost-West Richtung. Der Löwe ist entweder im
nörlichen oder im südlichen Teil. Wir nehmen an, er ist im nördlichen. Auf diese Weise fahren wir fort. Der Durchmesser
der Teile, die Bei dieser Halbiererei entstehen, strebt gegen Null. Auf diese Weise wird der Löwe schließlich von einem
Zaun beliebig kleiner Länge eingegrenzt.
Achtung: Bei dieser Methode achte man darauf, daß das schöne Fell des Löwen nicht beschädigt wird.
4. Die funktionalanalytische Methode. Die Wüste ist ein separabler Raum. Er enthält daher eine abzählbar dichte
Menge, aus der eine Folge ausgewählt werden kann, die gegen den Löwen konvergiert. Mit einem Käfig auf dem
Rücken, springen wir von Punkt zu Punkt dieser Folge und nähern uns so dem Löwen beliebig genau.
5. Die topologische Methode. Der Löwe kann topologisch als Torus aufgefaßt werden. Man transportiere die die Wüste
in den vierdimensionalen Raum. Es ist nun möglich die Wüste so zu deformieren, daß beim Rücktransport in den
dreidimensionalen Raum der Löwe verknotet ist. Dann ist er hilflos.
6. Die Banachsche oder iterative Methode. Es sei f eine Kontraktion der Wüste in sich mit Fixpunkt x0. Auf diesen
Fixpunkt stellen wir den Käfig. Durch sukzessive Iteration
W(n+1) = f (W(n)), n=0,1,2,... ( W(0)=Wüste )
wird die Wüste auf den Fixpunkt zusammengezogen. So gelangt der Löwe in den Käfig.
7. Die mathematisch-statistische Methode:
Satz 1: Die Anzahl der Sandkörner in der Wüste ist endlich.
Satz 2: Es existiert wenigstens ein Sandkorn auf dem der Löwe sitzt.
Problemlösungsprozeß: Man lege jedes Sandkorn in den Käfig. -> sind alle Sandkörner im Käfig, so ist auch der
Löwe im Käfig.
8. mathematisch-zeitliche Methode: Man warte undendlich lange. Nach unendlich langer Zeit ist der Löwe tot. Wir
suchen seine Gebeine und legen sie in den Käfig. (In der Problemspezifikation ist kein Wort von einem lebendigem
Löwen die Rede)
Physikalische Methoden:
1.Die Newtonsche Methode. Käfig und Löwe ziehen sich durch die Gravitationskraft an. Wir vernachlässigen die
Reibung. Auf diese Weise muß der Löwe früher oder später am Käfig landen.
2.Die Heisenberg-Methode. Ort und Geschwindigkeit eines bewegten Löwen lassen sich nicht gleichzeitig bestimmen.
Da bewegte Löwen also keinen physikalisch sinnvollen Ort in der Wüste einnehmen, kommen sie für die Jagd nicht in
Frage. Die Löwenjagd kann sich daher nur auf ruhende Löwen beschränken. Das Einfangen eines ruhenden,
bewegungslosen Löwen wird dem Leser als übungsaufgabe überlassen.
3.Die Einsteinsche oder relativistische Methode. Man überfliege die Wüste mit Lichtgeschwindigkeit. Durch die
relativistische Längenkontraktion wird der Löwe flach wie Papier. Man greife ihn, rolle ihn auf und mache ein
Gummiband herum.
KI-Methode:
suche(Löwe,Wüste,_) :- var(Wüste),!,fail.
% In einer nicht instantiierten W"uste
% lassen sich keine L"owen fangen.
suche(Löwe,Wüste,Wüste) :- atomic(Wüste), gefunden(Löwe,Wüste).
% Wenn die W"uste atomar ist,
% mu"s dort der L"owe sein.
suche(Löwe,[],_):- !, fail.
% Wenn die W"uste leer ist, ist auch
% kein L"owe drin.
suche(Löwe,[HEAD],HEAD) :- gefunden(Löwe,HEAD).
% Wenn der L"owe im ersten Element
% der W"uste ist, dann fertig.
suche(Löwe,[_|T],X) :- suche(Löwe,T,X).
% Sonst weiter schauen.
fange(Was,Wo,Womit) :-
fange(Was,Wo,WoGenau),
bewege(Womit,WoGenau).
gefunden(Was,Worin) :- member(Was, Worin).
bewege(Was, _ ) :- retract(position(Was,_)), fail.
bewege(Was,Wohin) :- asserta(position(Was,Wohin)).
test_Wüste([Wüste_1, Wüste_2, Wüste_3, Wüste_4, Wüste_5,
Wüste_6, Wüste_7, [Wüste_8, Löwe], Wüste_9,
Wüste_A, [Wüste_B, wagen], Wüste_C, Wüste_D]).
fange_Löwe_test :-
bewege(Käfig,wagen),
test_Wüste(Wüste),
fange(Löwe,Wüste,Käfig).
Iterative Methoden
! Geeignete Datenstrukturen werden vorrausgesetzt !
1. Als Standardlösung ist immer zu empfehlen:
MODULE Fang;
FROM Problem IMPORT Loesung;
BEGIN;
Loesung;
END Fang.
2. Auch in ASM (MS-DOS) ist es möglich (ab MASM 9.0 oder TASM 4.5):
dosseg
.DATA
MAX equ 65535
Wüsten_Feld db MAX dup (0)
Käfig db
extern Löwe_Fkt_Nummer:Word ; DOS-Int. Nummer
.CODE
lds si, W_Feld ; ES:DI zeigt auf Anfang des Feldes
cld
mov CX,MAX ; CX als max. Index
M1:
lodsb
cmp al,Löwe
je Gefangen
loop M1
jmp Error
Gefangen:
mov BX,SI
mov AX,Löwe_Fkt_Nummer
lds di, Käfig
int 21h ; Dos-Interrupt, da alle aufwendigen Proc. in
; ASM ausgelagert werden sollen.
Error:
int 20h
END
3. Die einzigste wahrhaftige Lösung , die wirklich funktioniert , ist in der genialen Umgebung des LPC, das man
in UNItopia bewundern kann. /* Ist ein Multi-User-Textadventures, geschrieben in C++-Clone. */ { Werbung
: einloggen unter telnet 129.69.221.120 3333 und spielen }
int fang(string str)
{ object ob1,ob2,ob3;
if (!str || str!="Löwe mit Käfig")
{ write("WEN willst du mit WAS fangen ?\n");
return 1;
}
ob1=clone_object("/obj/Wüste"); /* Wüste enthält Löwe s.Aufgabe */
ob2=clone_object("/obj/Käfig");
if (!ob3=present("Löwe",ob1)
{ write("Es ist kein Löwe in der Wüste !\n"); /* Falls weggerannt */
return 1;
}
ob3->move(ob2);
write("Der Löwe befinde sich jetzt im Käfig.\n");
return 1;
}
Diese Funktion muß noch an ein Ereignis angehängt werden, die Objekte
Käfig.c und Wüste.c sind geeignet zu implementieren.
4. In Turbo Pascal geht dieses Problem natürlich auch:
program Test_Loesung;
type Wüster_Typ= Array[1..Max_X,1..Max_Y] of Index;
Inhalt = { weiß nicht }
Käfig_Typ = record
voll : Boolean;
Inhalt : Tier;
end;
Löwen_Typ = Tier;
var Wüste : Wüster_Typ;
Käfig : Käfig_Typ;
Tiere : Array[1..Max_Tiere] of Tier; { Falls noch Kamele in der Wüste }
{ sind . }
procedure Löwen_Fang;
var i,j:Word;
begin;
Käfig.voll:=false;
for i:=1 to Max_X do { Wüste nach Löwe absuchen }
for j:=1 to Max_Y do
if Wüste[i,j]=LöweN_INDEX then begin;
Käfig.Inhalt:=Tiere[Wüste[i,j]];
Käfig.voll:=true;
Wüste[i,j]:=KEINER_INDEX;
exit; { Da der Käfig schon voll }
end; { ist.Man könnte aber auch }
{ mit dieser Procedure alle Löwen einfangen. }
WriteLn('Achtung ! Kein Löwe gefunden, wie wärs mit einem Kamel ?');
end;
begin;
Init; { Wüste, Tiere werden eingestellt. }
Löwen_Fang;
if (Käfig.voll) then WriteLn(' Ok,der Löwe ist im Käfig.')
else WriteLn('Achtung ! Kein Löwe gefunden, durch "+
'Abänderung in KAMEL_INDEX wäre vielleicht"+
#10#13'ein Kamel möglich ?');
end.
5. Sogar als Shellscript geht es schon:
#!/bin/sh
for $tier in $Wüste
do
if [ $tier = $Löwe ]
then mv $tier $Käfig; exit 0
fi
done
Methode der Telekom:
Man benötigt dazu nur eine Telefonzelle und eine Fahradklingel. Die Telefonzelle wird in der Wüste aufgestellt und man klingelt
mit der Fahradklingel. Der Löwe hört das Klingeln, will ans Telefon und wenn er die Zelle betreten hat, muß man nur noch die
Tür verschließen.
Methode von Herlitz:
Man benötigt hierfür nur ein Notizblock der entsprechenden Firma. Damit setzt man sich auf eine Palme und wartet bis der
Löwe sich unter diese legt. Nun zerreißt man den Notizblock und und läßt die Papierschnitzel auf den Löwen regnen. Der
denkt es schneit und erfiert.