Funktionen höherer Ordnung
Rechnen in unterschiedlichen Notationen
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
Überlege dir geeignete Funktionen und implementiere diese, um mit den folgenden REPL-Ausgaben das Ergebnis $27$ zu erhalten. Verzichte bei der Funktionserstellung erst einmal auf die Signaturdefinitionen.
(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: Sammlung der 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.
Verzichte bei der Funktionserstellung erst einmal auf die Signaturdefinition.
> (rechnen * 9 3)
> (rechnen 100 - 73)
> (rechnen 54 2 /)
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önnte zum Beispiel sein:
"$\text{Rechne mir bitte 14 und 77.5 zusammen.}$"
Ein möglicher erster Schritt zur Verarbeitung des Prompts besteht darin, diesen 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) Übertrage die Funktion calcPrompt
in dein Programm und mache dich mit der Funktionsweise
der Funktion vertraut.
(b) Schreibe die Funktion getFunc
, um die korrekte Funktionsweise von calcPrompt
zu erreichen.
Verzichte bei der Funktionserstellung erst einmal auf die Signaturdefinition.