www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Blubberbrause

Gepostet:
25.01.2010 17:17

Algebraische Typen - Aufgabe  
Hallo zusammen. Folgende Aufgabe muss ich bis Mittwoch erledigen und ich würde mich freuen, wenn der ein oder andere mir ein wenig unter die Arme greift. Es geht ersteinmal um Aufgabe 1a.

Aufgabe:
1a) Definieren Sie einen algebraischen Typ Mobile. Ein Mobile wird aus Kugeln und Staeben zusammengesetzt. Die einfachste Form ist eine einzelne Kugel. Bei jedem Stab haengen an den aeußeren Enden zwei Submobiles (die durch Faeden befestigt sind). Ihr erster Entwurf soll nur die prinzipielle Struktur repraesentieren (Gewichte und Abmessungen spielen noch keine Rolle, die Faeden koennen in der gesamten Darstellung vernachlaessigt werden). Nennen Sie die Konstruktoren Kugel und Stab. Implementieren Sie Mobile als ein Exemplar der Klasse Eq, wobei zwei Mobiles als gleich angesehen werden sollen, wenn sich das eine durch Rotationen in das andere umwandeln laesst.

Link: http://www.inf.fu-berlin.de/lehre/WS09/infa/u12.pdf

Lösungshinweise:
Im ersten Teil der Aufgabe geht es um die Definition eines algebraischen Typs Mobile mit zwei Konstruktoren Kugel und Stab, der große Aehnlichkeit mit dem Datentyp fuer echte Binaerbaeume hat. Um schon auf Teil b) vorbereitet zu sein, kann man dem Kugelkonstruktor gleich noch einen Float-Parameter uebergeben, der zunaechst noch keine Rolle spielen soll. Wuerde man Eq direkt ableiten, muessten die beiden linken Teilmobiles gleich sein, ebenso die beiden rechten. Wir wollen eine Gleichheit, bei der die Rollen von linken und rechten Teilmobiles auch vertauscht werden koennen.

Link: http://www.inf.fu-berlin.de/lehre/WS09/infa/hinweiseU12.pdf
Forum: http://foren.spline.inf.fu-berlin.de/viewtopic.php?f=400&t=9902

Vorüberlegungen | Lösungsansätze [Hilfe zum besseren Einstieg]:

Zu 1a)
i) Zeichnungen: http://www.2shared.com/file/10894905/8cca3aa0/U12_1a_Ueberlegung.html
ii) Abgabe aus WS02 (bei gleichem Prof jedoch bin ich mir nicht sicher, ob die Aufgaben exakt identisch sind)
import ResolutionBasics

-----------------------
-- Aufgabe 2
-----------------------

-- 2a)

data MobilE = KugeL | StaB MobilE MobilE

-- aequivalent testet, ob zwei MobilEs gleich sind, wobei die Drehbarkeit
-- berücksichtigt wird.

aequivalent :: MobilE -> MobilE -> Bool
aequivalent KugeL KugeL = True
aequivalent (StaB a b) (StaB c d) = ((aequivalent a c) && (aequivalent b d))
|| ((aequivalent a d) && (aequivalent b c))
aequivalent _ _ = False


-- 2b)
data Mobile = Kugel Float | Stab Mobile Mobile

-- laenge ermittelt die Länge des obersten Stabes eines Mobiles und gibt als Tupel
-- die Längen links und rechts von der Aufhängung aus.
-- Die Funtkion länge bestimmt dabei die Gesamtlänge des Stabes, die dann über die
-- Massen entsprechend ins Verhältnis gesetzt werden.
-- Die Massen werden rekursiv durch die Funktion masse ermittelt.
-- Die Gesamtlänge des obersten Stabes besteht aus der Länge des rechten Teils des
-- linken Mobiles und der Länge des linken Teils des rechten Mobiles. Diese werden
-- durch wegR bzw. wegL bestimmt.

laenge :: Mobile -> (Float, Float)
laenge (Kugel m) = (0,0)
laenge (Stab l r) = (länge * masseR / masseG, länge * masseL / masseG)
where länge, masseR, masseL, masseG :: Float
masseR = masse r
masseL = masse l
masseG = masseR + masseL

länge = (wegR l) + (wegL r)

wegR, wegL :: Mobile -> Float
wegR (Kugel a) = 0.5
wegR (Stab a b) = (snd (laenge (Stab a b))) + (wegR b)
wegL (Kugel a) = 0.5
wegL (Stab a b) = (fst (laenge (Stab a b))) + (wegL a)

masse :: Mobile -> Float
masse (Kugel m) = m
masse (Stab l r) = (masse l) + (masse r)

-- 2c)
-- laenge2 funktioniert nahezu analog zu 2b). Nur wird hier die freie Drehbarkeit
-- vorausgesetzt. Daher werden hier sowohl beim linken als auch beim rechten Mobile
-- mit wegM der maximale Weg ermittelt und nicht nur der linke bzw. rechte.

laenge2 :: Mobile -> (Float, Float)
laenge2 (Kugel m) = (0,0)
laenge2 (Stab l r) = (länge * masseR / masseG, länge * masseL / masseG)
where
länge, masseR, masseL, masseG :: Float
masseR = masse r
masseL = masse l
masseG = masseR + masseL

länge = (wegM l) + (wegM r)

wegM :: Mobile -> Float
wegM (Kugel a) = 0.5
wegM (Stab a b) = max (fst (laenge2 (Stab a b)) + wegM a)
(snd (laenge2 (Stab a b)) + wegM b)


Würde mich freuen, wenn man mich unterstützt. Besitze leider keinen Übungspartner.
Zum Seitenanfang    
 
Siracusa

Gepostet:
25.01.2010 19:12

   
Hallo,

bin mir nicht sicher was du jetzt genau wissen willst, weil du die Lösung ja schon gepostet hast. Fehlt eigentlich nur noch die Instanz der Klasse Eq. Dazu gibt es hier zwei Beispiele: http://www.fh-wedel.de/~si/seminare/ss02/Ausarbeitung/2.types/typhas5.html.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Blubberbrause

Gepostet:
25.01.2010 19:39

   
Ich bin mir nicht sicher, ob ich die Lösung aus dem WS02 einfach übernehmen kann.Es ist ja nicht von mir und die Aufgabenstellung von damals wurde gesperrt bzw. ist gelöscht worden. Kann also nicht nachvollziehen in welchem Kontext genau der Code geschrieben wurde. Er schien mir nur gut zu der Aufgabenstellung zu passen:

1) Warum kommt in dem Code "True" raus, wenn allein eine Kugel mit einer Kugel verglichen wird (aequivalent KugeL KugeL = True)?

In meiner Zeichnung "U12_1a_Ueberlegung.pdf" hatte ich mir gedacht, dass es relevant ist was für ein Wert diese Kugel bekommt oder hab ich die Aufgabenstellung nicht ganz begriffen? Zwar wird in der Aufgabenstellung gesagt, dass "Stab" einen zusätzlichen Parameter bekommt (für 1b) aber ich bin mal davon ausgegangen, dass "Kugel" auch eine Wertzuweisung benötigt, denn irgendeine Unterscheidung muss es doch für die Mobiles in 1a geben, wenn die Stäbe noch nicht berücksichtigt werden. Die Fäden spielen ja auch keine Rolle. Und man soll ja gegebenenfalls rotieren. Dazu hatte ich ja ein Beispiel in der Pdf.

2) Genau zu diesem Problem: "aequivalent (StaB a b) (StaB c d)" macht doch keinen Sinn, wenn die Stäbe keine Rolle spielen...

3) "data MobilE = KugeL | StaB MobilE MobilE".....Ich versteh nicht ganz was es mit dem Konstruktor StaB MobilE MobilE auf sich hat. In einer der nächsten Zeilen werden ja in der Funktion aequivalent 2 Stäbe miteinander verglichen. Jeweils mit a b & c d....stehen die Parameter für MobilE aus der oberen Zeile? Nirgends is Stab definiert....bzw ich raff den ganzen Abschnitt nicht ganz. Is das ganze Rekursiv?

PS: Danke für den Link

Edit: Zu 3) Hatte grade evtl ein kleines Aha-Erlebniss: Wenn man viele Submobiles hat und man übergibt der Funktion zwei Staebe dann verlangt ja die Aufgabe, dass an jedem Stab 2 Kugeln drann kleben. Das wiederrum würde bedeuten, dass in dem Fall wieder die Funktion "aequivalent" aufgerufen werden müssten. Jetzt betrachtet man aber die beiden Kugeln und der Fall wird ja in dem Code am Anfang abgefangen......sehe ich das richtig?

Zum Seitenanfang    
 
Siracusa

Gepostet:
25.01.2010 23:47

   
zu 1.) Wenn die Kugeln keinen Parameter haben sind sie per Definition alle gleich. Wenn sie noch einen Parameter haben, muss dieser verglichen werden und entscheidet dann, ob die beiden Kugeln gleich sind.

zu 2.) Die Stäbe spielen auch keine Rolle. Schau dir mal die rechte Seite an, dort wird das Problem nämlich rekursiv auf die "Untermobiles" a, b, c und d abgewälzt, indem diese verglichen werden. Diese Zeile heißt soviel wie "wenn beide Mobiles oben einen Stab haben, dann vergleiche die jeweiligen Untermobiles um zu entscheiden, ob sie gleich sind."

zu 3.) An jedem Stab müssen nicht zwei Kugeln hängen, sondern zwei weitere Mobiles. Wie die genau aussehen ist erstmal egal. Wichtig ist nur, ein Mobile ist entweder eine Kugel oder ein Stab mit zwei Untermobiles. Also wie bei Bäumen, jeder Stab entspricht einem Knoten mit Unterbäumen und jede Kugel entspricht einem Blattknoten.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Blubberbrause

Gepostet:
26.01.2010 18:36

   
Alles klar. Hat mir geholfen und ich denke ich habe alles soweit hinbekommen. Danke.

Gruß
Zum Seitenanfang