Informatik 1 - Mitschriften von Klaas Ole Kürtz

Informatik 1 - Mitschriften von Klaas Ole Kürtz Informatik 1 - Mitschriften von Klaas Ole Kürtz

28.03.2014 Aufrufe

• Selektoren (define (operand1 S) (cadr S)) (define (operand2 S) (caddr S)) mathematische Regeln: • dc dx = 0 • dx dx = 1 • d(u+v) dx = du dx + dv dx • d(u·v) dx = u · dv + v · du dx dx Mögliche Implementierung: (define (ableitung a v) (cond ((konstante? a) 0) ((variable? a) (if (gleiche-variable? a v) 1 0)) ((summe? a) (konstr-summe (ableitung (operand1 a) v) (ableitung (operand2 a) v))) ((produkt? a) (konstr-summe (konstr-produkt (operand1 a) (ableitung (operand2 a) v)) (konstr-produkt (operand2 a) (ableitung (operand1 a) v)))) (else (error "Ableitung dieser Funktion nicht implementiert")))) Beispiele für Ausgaben: > (ableitung ’(+ x 3) ’x) (+ 1 0) > (ableitung ’(* x y) ’x) (+ (* x 0) (* y 1)) Die Ausgabe ist also richtig, aber nicht optimal (Produkt mit 0 ist immer 0 etc.), Verbesserung: in die Konstruktoren mathematische Regeln einbauen (x · 0 = 0; x · 1 = x; 0 + x = x): (define (konstr-summe a1 a2) (cond ((and (number? a1) (number? a2)) (+ a1 a2)) ((number? a1) (if (= a1 0) a2 (list ’+ a1 a2))) ((number? a2) (if (= a2 0) a1 (list ’+ a1 a2))) 26

(else (list ’+ a1 a2)))) (define (konstr-produkt a1 a2) (cond ((and (number? a1) (number? a2)) (* a1 a2)) ((number? a1) (cond ((= a1 1) a2) ((= a1 0) 0) (else (list ’* a1 a2)))) ((number? a2) (cond ((= a2 1) a1) ((= a2 0) 0) (else (list ’* a1 a2)))) (else (list ’* a1 a2)))) 3.2.4 Beispiel: Implementierung von Mengen Menge: Ansammlung einzelner Objekte (keine Reihenfolge, keine doppelten Elemente), Datentyp mit Operationen vereinigen, schnitt, hinzufuegen, element?; Gesetze: (element? x (hinzufuegen x S)) = #t (element? x (vereinigung S T)) = (or (element? x S) (element? x T)) (element? x (schnitt S T)) = (and (element? x S) (element? x T)) (element? x leer) = #f (hinzufuegen x (hinzufuegen x S)) = (hinzufuegen x S) (hinzufuegen x (hinzufuegen y S)) = (hinzufuegen y (hinzufuegen x S)) Idee: Menge darstellen als Liste der Elemente (ohne Duplikate) (define (element? x m) (cond ((null? m) #f) ((equal? x (car m)) #t) ( else (element? x (cdr m))))) (define leer ()) (define (hinzufügen x m) (if (element? x m) m (cons x m))) (define (schnitt m1 m2) (cond ((null? m1) leer) ((element? (car m1) m2) (cons (car m1) (schnitt (cdr m1) m2))) ( else (schnitt (cdr m1) m2)))) (define (vereinigung m1 m2) (cond ((null? m1) m2) ((element? (car m1) m2) (vereinigung (cdr m1) m2)) (else (cons (car m1) 27

• Selektoren<br />

(define (operand1 S) (cadr S))<br />

(define (operand2 S) (caddr S))<br />

mathematische Regeln:<br />

• dc<br />

dx = 0<br />

• dx<br />

dx = 1<br />

• d(u+v)<br />

dx<br />

= du<br />

dx + dv<br />

dx<br />

• d(u·v)<br />

dx<br />

= u · dv + v · du<br />

dx dx<br />

Mögliche Implementierung:<br />

(define (ableitung a v)<br />

(cond ((konstante? a) 0)<br />

((variable? a) (if (gleiche-variable? a v) 1 0))<br />

((summe? a) (konstr-summe (ableitung (operand1 a) v)<br />

(ableitung (operand2 a) v)))<br />

((produkt? a) (konstr-summe (konstr-produkt (operand1 a)<br />

(ableitung (operand2 a) v))<br />

(konstr-produkt (operand2 a)<br />

(ableitung (operand1 a) v))))<br />

(else (error "Ableitung dieser Funktion nicht implementiert"))))<br />

Beispiele für Ausgaben:<br />

> (ableitung ’(+ x 3) ’x)<br />

(+ 1 0)<br />

> (ableitung ’(* x y) ’x)<br />

(+ (* x 0) (* y 1))<br />

Die Ausgabe ist also richtig, aber nicht optimal (Produkt mit 0 ist immer 0<br />

etc.), Verbesserung: in die Konstruktoren mathematische Regeln einbauen<br />

(x · 0 = 0; x · 1 = x; 0 + x = x):<br />

(define (konstr-summe a1 a2)<br />

(cond ((and (number? a1) (number? a2)) (+ a1 a2))<br />

((number? a1) (if (= a1 0)<br />

a2<br />

(list ’+ a1 a2)))<br />

((number? a2) (if (= a2 0)<br />

a1<br />

(list ’+ a1 a2)))<br />

26

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!