<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.mafiasi.de/index.php?action=history&amp;feed=atom&amp;title=P1-WS04-MusterLoesung06.txt</id>
	<title>P1-WS04-MusterLoesung06.txt - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mafiasi.de/index.php?action=history&amp;feed=atom&amp;title=P1-WS04-MusterLoesung06.txt"/>
	<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;action=history"/>
	<updated>2026-10-18T13:50:53Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Fachschaft Informatik</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;diff=3197&amp;oldid=prev</id>
		<title>PatrickFey: 2 Versionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;diff=3197&amp;oldid=prev"/>
		<updated>2007-11-05T05:50:15Z</updated>

		<summary type="html">&lt;p&gt;2 Versionen&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 5. November 2007, 05:50 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;de&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(kein Unterschied)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>PatrickFey</name></author>
	</entry>
	<entry>
		<id>https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;diff=3196&amp;oldid=prev</id>
		<title>fsrwiki_&gt;Oddmuse Import: link fix</title>
		<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;diff=3196&amp;oldid=prev"/>
		<updated>2007-11-05T05:49:25Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;a href=&quot;https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;amp;diff=3196&amp;amp;oldid=3195&quot;&gt;Änderungen zeigen&lt;/a&gt;</summary>
		<author><name>fsrwiki_&gt;Oddmuse Import</name></author>
	</entry>
	<entry>
		<id>https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;diff=3195&amp;oldid=prev</id>
		<title>Muelli am 1. Dezember 2006 um 18:13 Uhr</title>
		<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung06.txt&amp;diff=3195&amp;oldid=prev"/>
		<updated>2006-12-01T18:13:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
%						Musterloesung Aufgabenblatt 6&lt;br /&gt;
%								P1 WiSe 04/05&lt;br /&gt;
%							   Daniel Schreckling&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 1&lt;br /&gt;
% ---------&lt;br /&gt;
&lt;br /&gt;
% Hilfsprädikat max(+Zahl1, +Zahl2, ?Max)&lt;br /&gt;
%&lt;br /&gt;
% Liefert in ?Max das Maximum der Zahlen +Zahl1&lt;br /&gt;
% und +Zahl2&lt;br /&gt;
&lt;br /&gt;
max(Zahl1, Zahl2, Zahl2) :- Zahl1 &amp;lt;  Zahl2.&lt;br /&gt;
max(Zahl1, Zahl2, Zahl1) :- Zahl1 &amp;gt;= Zahl2.&lt;br /&gt;
&lt;br /&gt;
% Hilfsprädikat Ort(?Ort, ?Hoehe)&lt;br /&gt;
%&lt;br /&gt;
% Liefert die ?Hoehe zu einem Ort ?Ort&lt;br /&gt;
&lt;br /&gt;
ort(Ort, Hoehe) :-&lt;br /&gt;
	region(Ort,Hoehe).&lt;br /&gt;
ort(Ort, Hoehe) :-&lt;br /&gt;
	wasserwerk(Ort, Hoehe).&lt;br /&gt;
ort(Ort, Hoehe) :-&lt;br /&gt;
	pumpstation(Ort, Hoehe).&lt;br /&gt;
&lt;br /&gt;
% es werden Prädikate aus früheren Übungsaufgaben verwendet&lt;br /&gt;
% und modifiziert&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
% Aufgabe 1a&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% Hilfsprädikat hoehen_unterschied(+Ort1, +Ort2, ?Unterschied)&lt;br /&gt;
%&lt;br /&gt;
% berechnet die Hoehendifferenz nach der Vorschrift:&lt;br /&gt;
%   Hoehe von Ort1 minus Hoehe von Ort2&lt;br /&gt;
&lt;br /&gt;
hoehen_unterschied(Ort1, Ort2, Unterschied) :- &lt;br /&gt;
	ort(Ort1, Hoehe1),&lt;br /&gt;
	ort(Ort2, Hoehe2),&lt;br /&gt;
	Unterschied is (Hoehe1 - Hoehe2).&lt;br /&gt;
&lt;br /&gt;
% hoehen_unterschied_verb(+Senke, +Quelle, ?Unterschied)&lt;br /&gt;
%&lt;br /&gt;
% Gelingt, wenn +Senke und +Quelle in Fließrichtung direkt &lt;br /&gt;
% miteinander verbunden sind. ?Unterschied enthält bei &lt;br /&gt;
% Erfolg den Hoehenunterschieds ziwschen Senke und Quelle&lt;br /&gt;
	&lt;br /&gt;
hoehen_unterschied_verb(Senke, Quelle, Unterschied) :-	&lt;br /&gt;
	ist_angeschlossen_an(Senke, Quelle),&lt;br /&gt;
	hoehen_unterschied(Senke, Quelle, Unterschied).&lt;br /&gt;
	&lt;br /&gt;
% Aufgabe 1b&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
% hoehenunterschied_ww_verbr(+Wasserwerk, +VerbrRegion, ?Unterschied)&lt;br /&gt;
%&lt;br /&gt;
% Gelingt, wenn die Verbraucherregion +VerbrRegion letztlich von &lt;br /&gt;
% +Wasserwerk mit Wasser versorgt wird. ?Unterschied enthaelt bei Erfolg &lt;br /&gt;
% den Hoehenunterschied zwischen Wasserwerk und Verbraucherregion.&lt;br /&gt;
% Da es mehrere Wege geben kann, liefert hoehen_unterschied_ww_verbr\3 &lt;br /&gt;
% gegebenenfalls auch mehrer Hoehenunterschiede.&lt;br /&gt;
&lt;br /&gt;
hoehenunterschied_ww_verbr(Wasserwerk, VerbrRegion, Unterschied) :-&lt;br /&gt;
	wasserwerk(Wasserwerk, HoeheWW),&lt;br /&gt;
	region(VerbrRegion, HoeheVR),&lt;br /&gt;
	wird_versorgt_von(VerbrRegion, Wasserwerk, _),&lt;br /&gt;
	hoehen_unterschied(VerbrRegion, Wasserwerk, Unterschied).&lt;br /&gt;
	&lt;br /&gt;
% Aufgabe 1c&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
% wird_versorgt_von(?Senke, ?Quelle, ?MaxDiff)&lt;br /&gt;
%&lt;br /&gt;
% Gelingt, wenn ?Senke von ?Quelle mit Trinkwasser versorgt wird.&lt;br /&gt;
% In ?MaxDiff wird die größte Höhendifferenz gespeichert,&lt;br /&gt;
% die auf irgendeinem Weg von der Senke zur Quelle überwunden wird.&lt;br /&gt;
% Da es mehrere Wege geben kann, liefert wird_versorgt_von\2 &lt;br /&gt;
% gegebenenfalls auch mehrer Hoehenunterschiede.&lt;br /&gt;
&lt;br /&gt;
wird_versorgt_von(Senke,Quelle, MaxDiff) :-&lt;br /&gt;
	wasserwerk(Quelle, _),&lt;br /&gt;
  	ist_angeschlossen_an(Senke,Quelle),&lt;br /&gt;
	hoehen_unterschied(Senke, Quelle, MaxDiff).&lt;br /&gt;
&lt;br /&gt;
wird_versorgt_von(Senke,Quelle, MaxDiff) :-&lt;br /&gt;
  	ist_angeschlossen_an(Senke,Ort),&lt;br /&gt;
  	wird_versorgt_von(Ort,Quelle, ThisDiff),&lt;br /&gt;
	hoehen_unterschied(Senke, Ort, Diff),&lt;br /&gt;
	max(Diff, ThisDiff, MaxDiff).&lt;br /&gt;
&lt;br /&gt;
% max_hoehenunterschied_ww_verbr(+Wasserwerk, +VerbrRegion, ?MaxDiff)&lt;br /&gt;
%&lt;br /&gt;
% Gelingt, wenn die Verbraucherregion +VerbrRegion letztlich von &lt;br /&gt;
% +Wasserwerk mit Wasser versorgt wird. ?MaxDiff liefert bei Erfolg &lt;br /&gt;
% den maximalen Hoehenunterschied zwischen zwei Netzknoten auf dem Weg&lt;br /&gt;
% zwischen Wasserwerk und Verbraucherregion.&lt;br /&gt;
% Da es mehrere Wege geben kann, liefert hoehen_unterschied_ww_verbr\3 &lt;br /&gt;
% gegebenenfalls auch mehrer Hoehenunterschiede.&lt;br /&gt;
&lt;br /&gt;
max_hoehenunterschied_ww_verbr(Wasserwerk, VerbrRegion, MaxDiff) :-&lt;br /&gt;
	region(VerbrRegion, _),&lt;br /&gt;
	wasserwerk(Wasserwerk, _),&lt;br /&gt;
	wird_versorgt_von(VerbrRegion, Wasserwerk, MaxDiff).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 2a&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
% zinseszins(+Anlage,+Zinssatz,+Laufzeit,?Ausschuettung)&lt;br /&gt;
%&lt;br /&gt;
% Das Kapital +Anlage ist in Währungseinheiten anzugeben,&lt;br /&gt;
% der +Zinssatz in Prozent, z.b. `5&amp;#039; entspricht 5%,&lt;br /&gt;
% die +Laufzeit in Jahren.&lt;br /&gt;
% Die +Ausschuettung wird ebenfalls in Währungseinheiten ausgegeben&lt;br /&gt;
&lt;br /&gt;
zzins(Anlage, _, 0, Anlage).&lt;br /&gt;
zzins(Anlage, Zinssatz, Laufzeit, Ausschuettung) :-&lt;br /&gt;
	Laufzeit &amp;gt; 0,&lt;br /&gt;
	Years2Go is Laufzeit - 1,&lt;br /&gt;
	zzins(Anlage, Zinssatz, Years2Go, ZwischenBetrag),&lt;br /&gt;
	Ausschuettung is (ZwischenBetrag * (1 + Zinssatz/100)).&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 2b&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
% Im Prolog-System genügen fünf Nachkommastellen, um genaue&lt;br /&gt;
% Verdopplung zu erreichen:&lt;br /&gt;
%&lt;br /&gt;
% ?- zzins(1000,7.17735,10,X).&lt;br /&gt;
%&lt;br /&gt;
% X = 2000.0 &lt;br /&gt;
&lt;br /&gt;
% Es gibt eine analytische Loesung, denn für das Kapital&lt;br /&gt;
% K_n nach n Jahren gilt bei einem Zinssatz p und einem&lt;br /&gt;
% Startkapital K:&lt;br /&gt;
%&lt;br /&gt;
% K_n = K * (1 + p/100)^n&lt;br /&gt;
%&lt;br /&gt;
% Damit ergibt sich für eine Verdopplung von K nach 10 Jahren&lt;br /&gt;
% (also K_10 = 2 * K) für den Zinssatz p folgende Gleichheit:&lt;br /&gt;
%&lt;br /&gt;
% p = (sqrt(10, 2) - 1) * 100 = 7.1773463&lt;br /&gt;
%&lt;br /&gt;
% wobei sqrt(10, 2) die 10te Wurzel aus 2 berechnet.&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 2c&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
% Prädikat zzinslist(+Anlage, +Zinssatz, +Laufzeit, ?Liste)&lt;br /&gt;
%&lt;br /&gt;
% Liefert zu einem Startkapital +Anlage und einem Zinssatz +Zinssatz&lt;br /&gt;
% eine Liste ?Liste der Kapitalbeträge in den Jahren +Laufzeit, in &lt;br /&gt;
% denen das Anlagekapital verzinst wird&lt;br /&gt;
&lt;br /&gt;
zzinslist(Anlage, Zinssatz, Laufzeit, Liste) :-&lt;br /&gt;
	findall(&lt;br /&gt;
		kapital(Jahr, Kapital), &lt;br /&gt;
		  (between(0, Laufzeit, Jahr), &lt;br /&gt;
		   zzins(Anlage, Zinssatz, Jahr, Kapital)), &lt;br /&gt;
		Liste).&lt;br /&gt;
&lt;br /&gt;
% ?-zzinslist(10000, 7.17735, 10, List).&lt;br /&gt;
% List = [kapital(0, 10000), &lt;br /&gt;
%	kapital(1, 10717.7), &lt;br /&gt;
%	kapital(2, 11487.0), &lt;br /&gt;
%	kapital(3, 12311.4), &lt;br /&gt;
%	kapital(4, 13195.1), &lt;br /&gt;
%	kapital(5, 14142.1), &lt;br /&gt;
%	kapital(6, 15157.2), &lt;br /&gt;
%	kapital(7, 16245.1), &lt;br /&gt;
%	kapital(8, 17411.0), &lt;br /&gt;
%	kapital(9, 18660.7), &lt;br /&gt;
%	kapital(10, 20000.0)]&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 3 &lt;br /&gt;
% ---------&lt;br /&gt;
&lt;br /&gt;
% Hier ein Beispiel, in dem das Ausmaß des quadratischen Wachstums&lt;br /&gt;
% veranschaulicht wird. Es wird eine normale Parabel gezeichnet, deren&lt;br /&gt;
% Punkte aber proportional zum Funktionswert größer werden. Das&lt;br /&gt;
% Ergebnis könnte jedem Monster/Alien/Katastrophenfilm entnommen sein;&lt;br /&gt;
% schon kubisches Wachstum wäre nicht mehr richtig zu erkennen,&lt;br /&gt;
% geschweige denn exponentielles.&lt;br /&gt;
%&lt;br /&gt;
% Man beachte die symmetrischen Moirémuster unterhalb des letzten&lt;br /&gt;
% Funktionswertes. &lt;br /&gt;
&lt;br /&gt;
draw(Max) :-&lt;br /&gt;
   free(@bild),&lt;br /&gt;
   new(@bild,picture(&amp;#039;Beispiel&amp;#039;,size(900,900))),&lt;br /&gt;
   send(@bild,background,colour(black)),&lt;br /&gt;
   send(@bild,open),&lt;br /&gt;
   draw_parabola(@bild,0,Max).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% draw_parabola(+Bildobjekt, +X, +MaxX) erzeugt eine normale Parabel,&lt;br /&gt;
% d.h. die Kurve y = x^2, wobei die Punkte proportional zum Wert y&lt;br /&gt;
% größer werden.&lt;br /&gt;
draw_parabola(_,X,MaxX):- X &amp;gt;= MaxX.&lt;br /&gt;
draw_parabola(Bild,X,MaxX) :-&lt;br /&gt;
        Y is X*X / 100,&lt;br /&gt;
        new(O, circle(Y)),&lt;br /&gt;
        send(O,fill_pattern(colour(yellow))),&lt;br /&gt;
        % XPCE zählt Y von links oben, aber wir wollen von links unten zählen&lt;br /&gt;
        Y2 is 300 - Y,&lt;br /&gt;
        send(Bild, display(O, point(X,Y2))),&lt;br /&gt;
        X2 is X + 1,&lt;br /&gt;
        draw_parabola(Bild,X2,MaxX).&lt;br /&gt;
&lt;br /&gt;
% :-draw(300).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 4a&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
%   (i) Bindungen sind X=y und Y=x&lt;br /&gt;
%  (ii) Bindungen sind L=a und X=[a,a]&lt;br /&gt;
% (iii) Bindungen sind F=[a,b], G=[[a,[b]], [[b]|a]], A=a und B=[b]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 4b&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
%% Prädikat last\2&lt;br /&gt;
%% mylast(+List, +Element)&lt;br /&gt;
%% Ausgabe: yes, wenn letztes Element der Liste +List &lt;br /&gt;
%% mit dem Element +Element identisch ist.&lt;br /&gt;
&lt;br /&gt;
mylast([Last], Last).&lt;br /&gt;
mylast([_|Tail], Element) :- mylast(Tail, Element).&lt;br /&gt;
&lt;br /&gt;
% Das Prädikat läßt sich sowohl zum Testen als auch zum Extrahieren&lt;br /&gt;
% oder Generieren einsetzten. Wenn nur Variable angegeben werden,&lt;br /&gt;
% werden nacheinander abstrakte Listen aller möglichen Längen&lt;br /&gt;
% angegeben. Bei leeren Listen mißlingt der Aufruf sofort.&lt;br /&gt;
&lt;br /&gt;
% Aufgabe 4c&lt;br /&gt;
% ----------&lt;br /&gt;
&lt;br /&gt;
% Hilfsprädikat gerade_Pos(+Liste, ?Element)&lt;br /&gt;
% ist erfolgreich, falls ?Element an einer Position&lt;br /&gt;
% in +Liste mit geradem Index steht (der Index ist &lt;br /&gt;
% nullbasiert, d.h. das erste Element in der Liste hat&lt;br /&gt;
% Index 0, das zweite Element den Index 1, ...)&lt;br /&gt;
%&lt;br /&gt;
% Die Anwendung dieses Prädikates auf eine leere Liste&lt;br /&gt;
% ist nicht erfolgreich.&lt;br /&gt;
&lt;br /&gt;
gerade_Pos([_,E|_], E).&lt;br /&gt;
gerade_Pos([_,_|R], E) :- gerade_Pos(R,E).&lt;br /&gt;
&lt;br /&gt;
% Teil (i)&lt;br /&gt;
% --------&lt;br /&gt;
&lt;br /&gt;
% Prädikat slice_i(+Liste, ?NewList)&lt;br /&gt;
%&lt;br /&gt;
% Extrahiert aus der Liste +Liste jedes zweite Element und &lt;br /&gt;
% speichert diese mit Hilfe gerade_Pos/2 und findall/3 in&lt;br /&gt;
% ?NewList&lt;br /&gt;
%&lt;br /&gt;
% Da gerade_Pos/2 für eine leere Liste nicht erfolgreich,&lt;br /&gt;
% liefert slice_i([], NewList) in NewList auch eine leere &lt;br /&gt;
% Liste.&lt;br /&gt;
&lt;br /&gt;
slice_i(List, NewList) :- &lt;br /&gt;
	findall(Element, gerade_Pos(List, Element), NewList).&lt;br /&gt;
&lt;br /&gt;
% Teil (ii)&lt;br /&gt;
% ---------&lt;br /&gt;
&lt;br /&gt;
% Prädikat slice_ii(+Liste, ?NewList)&lt;br /&gt;
%&lt;br /&gt;
% Extrahiert aus der Liste +Liste jedes zweite Element und &lt;br /&gt;
% konstruiert mit Hilfe von von Rekursion eine Ergebnisliste,&lt;br /&gt;
% die genau diese Elemente enthält&lt;br /&gt;
&lt;br /&gt;
slice_ii([], []).&lt;br /&gt;
slice_ii([_], []).&lt;br /&gt;
slice_ii([_,Element2|Tail], [Element2|NewList]) :- slice_ii(Tail, NewList).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Muelli</name></author>
	</entry>
</feed>