Funktionen höherer Ordnung
Rechnen in unterschiedlichen Darstellungen Präfix, Infix, Postfix-Darstellung
Eine Professorin möchte ihren Studierenden unterschiedliche Notationen mathematischer Ausdrücke beibringen. Dabei geht es ihr um folgende Notationen:
- Präfix-Notation: $(+\ 13\ \ 24)$
- Infix-Notation: $(13\ +\ 24)$
- Postfix-Notation: $(13\ \ 24\ +)$
Um die Gleichwertigkeit der Notationen darzustellen, sollen die Studierenden die Möglichkeit bekommen alle drei Notationen in Racket anzuwenden.
Aufgabe 1: Spezifische Notationsfunktionen
Schreibe geeignete Funktionen, um mit den folgenden REPL-Ausgaben das Ergebnis $27$ zu erhalten:
(a) Funktion zum Rechnen in der Präfix-Notation
> (prefix + 13 24)
> (prefix / 54 2)
(b) Funktion zum Rechnen in der Infix-Notation
> (infix 13 + 24)
> (infix 9 * 3)
(c) Funktion zum Rechnen in der Präfix-Notation
> (postfix 13 24 +)
> (postfix 100 73 -)
(d) Entwerfe einen geeigneten Ausdruck der sowohl prefix
, infix
als auch postifx
verwendet und das Ergebnis $27$ liefert.
Aufgabe 2: Notationen in einer Funktion
(a) Eine weitere Funktion soll unabhängig von dem angewandten Notationsstil eine Rechnung ausführen können.
Entwerfe die Funktion rechnen
die die folgenden Ausdrücke zulässt:
> (rechnen * 9 3)
> (rechnen 100 - 73)
> (rechnen 54 2 /)
(b) Die Funktion soll nicht mehr nur für Rechenaufgaben genutzt werden können, sondern auf beliebige
Operatoren-Operanden-Kombinationen. Verfeinere deine Funktion dahin, dass die Funktion op
die folgenden Ausdrücke zulässt:
> (op > 12.6 12.7)
> (op #t or #f)
> (op "Hallo" "Hola" string=?)
Rechnen mit KI-Chatbots
Das chatten mit KI-Chatbots wird immer beliebter, so auch die Verwendung der Chatbots zum Lösen von
Rechenaufgaben. Nutzende geben die Aufgaben häufig als ein Prompt in natürlicher Sprache ein.
Ein solcher Prompt könnten zum Beispiel sein:
"$\text{Rechne mir bitte 14 und 77.5 zusammen.}$"
Ein möglicher erster Schritt zur Verarbeitung besteht darin den Prompt in eine Liste von Wörtern aufzuteilen:
(list "Rechne" "mir" "bitte" "14" "und" "77.5" "zusammen.")
In einem zweiten Schritt würde die Liste auf die für die Rechnung relevanten Informationen reduziert werden:
(list "14" "und" "77.5")
Nun muss diese Information nur noch in einen ausführbaren Ausdruck umgewandelt werden.
Die Funktion calcPrompt
soll diese Aufgabe erfüllen:
;Bekommt eine Rechnung als Liste aus Strings übergeben und berechnet das Ergebnis
(: calcPrompt ((list-of string) -> real))
(check-expect (calcPrompt (list "14" "und" "77.5")) 91.5)
(check-expect (calcPrompt (list "123" "+" "216")) 339)
(check-expect (calcPrompt (list "7" "mal" "7")) 49)
(check-expect (calcPrompt (list "14" "durch" "5")) 2.8)
(define calcPrompt
(lambda (s)
(define a (first s))
(define b (first (rest s)))
(define c (first (rest (rest s))))
((getFunc b) (string->number a) (string->number c))
))
Aufgabe 3: Aus Text eine Funktion extrahieren
(a) Mache dich mit der gewünschten Funktionsweise der Funktion calcPrompt
vertraut und übertrage diese
in dein Programm.
(b) Schreibe die Funktion getFunc
, um die korrekte Funktionsweise des Programmes sicherzustellen.