Praktikum 6

  1. In dieser Aufgabe wollen wir das in der Vorlesung skizzierte System zum Rechnen mit komplexen Größen implementieren.
    1. Schreiben Sie zunächst die Prozeduren +c, -c, *c und /c, die die Rechenregeln für komplexe Zahlen realisieren. Benutzen Sie bei +c und -c die Interfaceprozeduren konstr-rechteck, reeller-teil und imag-teil, bei *c und /c die Interfaceprozeduren konstr-polar, abs-wert und winkel. Entscheiden Sie sich dann für eine Darstellung komplexer Zahlen (z. B. Rechteck) und implementieren Sie die sechs Interfaceprozeduren für diese Darstellung in einer separaten Datei.
    2. In einer dritten Datei werden die sechs Interfaceprozeduren für eine zweite Darstellung komplexer Zahlen (z. B. Polar) untergebracht. Ohne Änderung des ersten Moduls kann nun durch Laden der zweiten bzw. dritten Datei eine bestimmte Darstellung ausgewählt werden.
    3. Erweitern Sie das System durch manifeste Typen. In welche Datei(en) gehören die Prozeduren typ-anbinden, typ, inhalt, rechteck?, polar?, konstr-rechteck und konstr-polar? Die Prozeduren reeller-teil, imag-teil, abs-wert und winkel sollen im ersten Modul realisiert werden und explizit nach Darstellungsart des Operanden verzweigen. Vermeiden Sie Namenskonflikte im zweiten und dritten Modul durch Anhängen des Modulnamens an die Prozedurnamen!
    4. Stellen Sie nun Ihre Implementierung auf datengesteuerte Programmierung um. Versuchen Sie, das System so modular wie möglich zu gestalten!
  2. In der Vorlesung wurde ein Programm entworfen, das symbolische Differenzierung durchführt. Man kann die Prozedur "ableitung" als Verteiler ansehen, der die Zuteilung nach dem "Typ" des zu differenzierenden Ausdrucks vornimmt. Das "Typenetikett" ist das algebraische Operatorsymbol (z. B. +) und die auszuführende Operation ist "ableitung". Dann kann man in datengesteuertem Stil ableiten:
    (define (ableitung ausdr var)
      (cond ((konstante? ausdr) 0)
            ((variable? ausdr)
             (if (gleiche-variable? ausdr var) 1 0))
            (else ((get (operator ausdr) 'ableitung)
                   (operanden ausdr) var))))
    
    (define (operator ausdr) (car ausdr))
    (define (operanden ausdr) (cdr ausdr))
    1. Implementieren Sie das symbolische Ableiten auf diese Art für die vier Grundrechenarten. Warum können Konstante und Variable nicht ebenfalls datengesteuert abgeleitet werden?
    2. Wählen Sie eine beliebige weitere Ableitungsregel, z. B. für Potenzen mit dem Operatorsymbol **, und fügen Sie sie in dieses datengesteuerte System ein.