• Keine Ergebnisse gefunden

Eine Behauptung . . . Schon bekannte Funktionen: filter

N/A
N/A
Protected

Academic year: 2022

Aktie "Eine Behauptung . . . Schon bekannte Funktionen: filter"

Copied!
108
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Eine Behauptung . . .

Schon bekannte Funktionen:

filter:: (a→Bool)→[a]→[a]

filterp [ ] = [ ]

filterp (a:as) | p a =a: (filterp as)

| otherwise=filterp as map:: (a→b)→[a]→[b]

maph [ ] = [ ]

maph (a:as) = (h a) : (maph as)

(2)

filterp (a:as) | p a =a: (filterp as)

| otherwise=filterp as map:: (a→b)→[a]→[b]

maph [ ] = [ ]

maph (a:as) = (h a) : (maph as) F¨ur jede Wahl vonp,h undl gilt:

filterp (maph l) =

(3)

Eine Behauptung . . .

Schon bekannte Funktionen:

filter:: (a→Bool)→[a]→[a]

filterp [ ] = [ ]

filterp (a:as) | p a =a: (filterp as)

| otherwise=filterp as map:: (a→b)→[a]→[b]

maph [ ] = [ ]

maph (a:as) = (h a) : (maph as) F¨ur jede Wahl vonp,h undl gilt:

filterp (maph l) = maph (filter(p◦h) l)

(4)
(5)

. . . und ihr Beweis

Per Induktion ¨uber die L¨ange der Liste:

1. filterp (maph [ ]) = maph (filter (p◦h) [ ]) ? OK

(6)
(7)

. . . und ihr Beweis

Per Induktion ¨uber die L¨ange der Liste:

1. filterp (maph [ ]) = maph (filter (p◦h) [ ]) ? OK 2. filterp (maph (a:as)) = maph(filter(p◦h) (a:as))?

filterp (maph (a:as))

(8)

filterp (maph (a:as))

= filterp ((h a) : (maph as))

(9)

. . . und ihr Beweis

Per Induktion ¨uber die L¨ange der Liste:

1. filterp (maph [ ]) = maph (filter (p◦h) [ ]) ? OK 2. filterp (maph (a:as)) = maph(filter(p◦h) (a:as))?

filterp (maph (a:as))

= filterp ((h a) : (maph as))

= if p (h a)then (h a) : (filterp (maph as)) else filterp (maph as)

(10)

filterp (maph (a:as))

= filterp ((h a) : (maph as))

= if p (h a)then (h a) : (filterp (maph as)) else filterp (maph as)

= if (p◦h) athen (h a) : (maph (filter(p◦h) as)) else maph (filter(p◦h) as)

(11)

. . . und ihr Beweis

Per Induktion ¨uber die L¨ange der Liste:

1. filterp (maph [ ]) = maph (filter (p◦h) [ ]) ? OK 2. filterp (maph (a:as)) = maph(filter(p◦h) (a:as))?

filterp (maph (a:as))

= filterp ((h a) : (maph as))

= if p (h a)then (h a) : (filterp (maph as)) else filterp (maph as)

= if (p◦h) athen (h a) : (maph (filter(p◦h) as)) else maph (filter(p◦h) as)

= if (p◦h) athen maph (a: (filter(p◦h)as)) else maph (filter(p◦h) as)

(12)

filterp (maph (a:as))

= filterp ((h a) : (maph as))

= if p (h a)then (h a) : (filterp (maph as)) else filterp (maph as)

= if (p◦h) athen (h a) : (maph (filter(p◦h) as)) else maph (filter(p◦h) as)

= if (p◦h) athen maph (a: (filter(p◦h)as)) else maph (filter(p◦h) as)

= maph (if (p◦h)a then a: (filter(p◦h)as) else filter(p◦h) as)

(13)

. . . und ihr Beweis

Per Induktion ¨uber die L¨ange der Liste:

1. filterp (maph [ ]) = maph (filter (p◦h) [ ]) ? OK 2. filterp (maph (a:as)) = maph(filter(p◦h) (a:as))?

filterp (maph (a:as))

= filterp ((h a) : (maph as))

= if p (h a)then (h a) : (filterp (maph as)) else filterp (maph as)

= if (p◦h) athen (h a) : (maph (filter(p◦h) as)) else maph (filter(p◦h) as)

= if (p◦h) athen maph (a: (filter(p◦h)as)) else maph (filter(p◦h) as)

= maph (if (p◦h)a then a: (filter(p◦h)as) else filter(p◦h) as)

= maph (filter(p◦h) (a:as))

(14)

filterp (maph (a:as))

= filterp ((h a) : (maph as))

= if p (h a)then (h a) : (filterp (maph as)) else filterp (maph as)

= if (p◦h) athen (h a) : (maph (filter(p◦h) as)) else maph (filter(p◦h) as)

= if (p◦h) athen maph (a: (filter(p◦h)as)) else maph (filter(p◦h) as)

= maph (if (p◦h)a then a: (filter(p◦h)as) else filter(p◦h) as)

= maph (filter(p◦h) (a:as))

(15)

Ein weiteres Beispiel

Angenommen, wir wollen (f¨ur gewisse h,f,k undl) h (foldrf k l)

durch einen einzelnen Aufruf von foldrersetzen.

(16)

h (foldrf k ( : x1 :

x2 X : xn [ ]

)) = h f x1 f

x2 X f xn k

(17)

Ein weiteres Beispiel

Angenommen, wir wollen (f¨ur gewisse h,f,k undl) h (foldrf k l)

durch einen einzelnen Aufruf von foldrersetzen.

h (foldrf k ( : x1 :

x2 X : xn [ ]

)) = h f x1 f

x2 X f xn k Angenommen, wir w¨ussten ein g, so dass f¨ur allex und y,

(18)
(19)

. . . , dann:

h (foldrf k l) = foldrg (h k)l Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ?

(20)

Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK

(21)

. . . , dann:

h (foldrf k l) = foldrg (h k)l Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK 2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ?

(22)

Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK 2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ?

h (foldrf k (a:as))

(23)

. . . , dann:

h (foldrf k l) = foldrg (h k)l Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK 2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ?

h (foldrf k (a:as))

= h (f a(foldrf k as))

(24)

Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK 2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ?

h (foldrf k (a:as))

= h (f a(foldrf k as))

= g a (h (foldr f k as))

(25)

. . . , dann:

h (foldrf k l) = foldrg (h k)l Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK 2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ?

h (foldrf k (a:as))

= h (f a(foldrf k as))

= g a (h (foldr f k as))

= g a (foldr g (h k) as)

(26)

Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK 2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ?

h (foldrf k (a:as))

= h (f a(foldrf k as))

= g a (h (foldr f k as))

= g a (foldr g (h k) as)

= foldr g (h k) (a:as)

(27)

. . . , dann:

h (foldrf k l) = foldrg (h k)l Beweis per Induktion ¨uber die L¨ange der Liste:

1. h (foldrf k [ ]) = foldr g (h k) [ ] ? OK

2. h (foldrf k (a:as)) = foldrg (h k) (a:as) ? OK

(28)
(29)

Auf anderen Datentypen

Zum Beispiel:

dataTree a = Leaf a|Node (Tree a) (Treea) flat:: Tree a→[a]

flat(Leaf a) = [a]

flat(Nodet1 t2) = (flatt1)++(flatt2)

(30)

flat:: Tree a→[a]

flat(Leaf a) = [a]

flat(Nodet1 t2) = (flatt1)++(flatt2) incr:: Tree Int→Tree Int

incr(Leaf a) = Leaf (a+ 1)

incr(Nodet1 t2) = Node (incrt1) (incrt2)

(31)

Auf anderen Datentypen

Zum Beispiel:

dataTree a = Leaf a|Node (Tree a) (Treea) flat:: Tree a→[a]

flat(Leaf a) = [a]

flat(Nodet1 t2) = (flatt1)++(flatt2) incr:: Tree Int→Tree Int

incr(Leaf a) = Leaf (a+ 1)

incr(Nodet1 t2) = Node (incrt1) (incrt2) Behauptung:

flat(incrt) =

(32)

flat:: Tree a→[a]

flat(Leaf a) = [a]

flat(Nodet1 t2) = (flatt1)++(flatt2) incr:: Tree Int→Tree Int

incr(Leaf a) = Leaf (a+ 1)

incr(Nodet1 t2) = Node (incrt1) (incrt2) Behauptung:

flat(incrt) = map(+1) (flatt)

(33)

Auf anderen Datentypen

Beweis per struktureller Induktion:

1. flat(incr(Leaf a)) = map(+1) (flat(Leaf a))?

(34)
(35)

Auf anderen Datentypen

Beweis per struktureller Induktion:

1. flat(incr(Leaf a)) = map(+1) (flat(Leaf a))? OK

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

(36)

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

flat(incr(Node t1 t2))

(37)

Auf anderen Datentypen

Beweis per struktureller Induktion:

1. flat(incr(Leaf a)) = map(+1) (flat(Leaf a))? OK

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

flat(incr(Node t1 t2))

= flat(Node (incrt1) (incrt2))

(38)

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

flat(incr(Node t1 t2))

= flat(Node (incrt1) (incrt2))

= (flat(incrt1))++(flat(incrt2))

(39)

Auf anderen Datentypen

Beweis per struktureller Induktion:

1. flat(incr(Leaf a)) = map(+1) (flat(Leaf a))? OK

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

flat(incr(Node t1 t2))

= flat(Node (incrt1) (incrt2))

= (flat(incrt1))++(flat(incrt2))

= (map(+1) (flatt1))++(map(+1) (flatt2))

(40)

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

flat(incr(Node t1 t2))

= flat(Node (incrt1) (incrt2))

= (flat(incrt1))++(flat(incrt2))

= (map(+1) (flatt1))++(map(+1) (flatt2))

= map(+1) ((flatt1)++(flatt2))

(41)

Auf anderen Datentypen

Beweis per struktureller Induktion:

1. flat(incr(Leaf a)) = map(+1) (flat(Leaf a))? OK

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))?

flat(incr(Node t1 t2))

= flat(Node (incrt1) (incrt2))

= (flat(incrt1))++(flat(incrt2))

= (map(+1) (flatt1))++(map(+1) (flatt2))

= map(+1) ((flatt1)++(flatt2))

= map(+1) (flat(Node t1 t2))

(42)

2. flat(incr(Node t1 t2)) = map(+1) (flat(Nodet1 t2))? OK (mit Hilfe: (maph l1)++(maph l2) = maph (l1++l2))

(43)

Manchmal nicht so einfach

Naives Umdrehen einer Liste:

reverse:: [a]→[a]

reverse[ ] = [ ]

reverse(a:as) = (reverse as)++[a]

(44)

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l)

(45)

Manchmal nicht so einfach

Naives Umdrehen einer Liste:

reverse:: [a]→[a]

reverse[ ] = [ ]

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))?

(46)

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? maph (reverse (a:as))

(47)

Manchmal nicht so einfach

Naives Umdrehen einer Liste:

reverse:: [a]→[a]

reverse[ ] = [ ]

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? maph (reverse (a:as))

= maph ((reverseas)++[a])

(48)

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? maph (reverse (a:as))

= maph ((reverseas)++[a])

= (maph (reverseas))++(maph [a])

(49)

Manchmal nicht so einfach

Naives Umdrehen einer Liste:

reverse:: [a]→[a]

reverse[ ] = [ ]

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? maph (reverse (a:as))

= maph ((reverseas)++[a])

= (maph (reverseas))++(maph [a])

= (reverse (maph as))++[h a]

(50)

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? maph (reverse (a:as))

= maph ((reverseas)++[a])

= (maph (reverseas))++(maph [a])

= (reverse (maph as))++[h a]

(51)

Manchmal nicht so einfach

Naives Umdrehen einer Liste:

reverse:: [a]→[a]

reverse[ ] = [ ]

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? maph (reverse (a:as))

= maph ((reverseas)++[a])

= (maph (reverseas))++(maph [a])

= (reverse (maph as))++[h a]

(52)

reverse(a:as) = (reverse as)++[a]

Zu beweisen:

maph (reverse l) = reverse(map h l) Induktionsschritt:

2. map h (reverse (a:as)) = reverse(map h (a:as))? OK

(53)

Manchmal nicht so einfach

Effizientes Umdrehen einer Liste:

reverse :: [a]→[a]→[a]

reverse [ ] bs=bs

reverse (a:as) bs=reverse as (a:bs)

(54)

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ]

(55)

Manchmal nicht so einfach

Effizientes Umdrehen einer Liste:

reverse :: [a]→[a]→[a]

reverse [ ] bs=bs

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]?

(56)

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

(57)

Manchmal nicht so einfach

Effizientes Umdrehen einer Liste:

reverse :: [a]→[a]→[a]

reverse [ ] bs=bs

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

= maph (reverse as [a])

(58)

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

= maph (reverse as [a])

?

(59)

Manchmal nicht so einfach

Effizientes Umdrehen einer Liste:

reverse :: [a]→[a]→[a]

reverse [ ] bs=bs

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

= maph (reverse as [a])

?

(60)

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

= maph (reverse as [a])

?

(61)

Manchmal nicht so einfach

Effizientes Umdrehen einer Liste:

reverse :: [a]→[a]→[a]

reverse [ ] bs=bs

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

= maph (reverse as [a])

?

reverse (maph as) [h a]

(62)

reverse (a:as) bs=reverse as (a:bs) Zu beweisen:

maph (reverse l [ ]) = reverse (map h l) [ ] Induktionsschritt:

2. maph (reverse(a:as) [ ]) = reverse (maph (a:as)) [ ]? maph (reverse (a:as) [ ])

= maph (reverse as [a])

?

= reverse (maph as) [h a]

(63)

Freie Theoreme [Wadler, 1989]

Urspr¨ungliches Beispiel:

filter:: (a→Bool)→[a]→[a]

filterp [ ] = [ ]

filterp (a:as) | p a =a: (filterp as)

| otherwise=filterp as F¨ur jede Wahl vonp,h undl gilt:

filterp (map h l) = map h (filter(p◦h) l) Bewiesen per Induktion.

(64)

filterp (a:as) | p a =a: (filterp as)

| otherwise=filterp as F¨ur jede Wahl vonp,h undl gilt:

filterp (map h l) = map h (filter(p◦h) l) Bewiesen per Induktion.

Aber auch m¨oglich ohneInduktion!

(65)

Freie Theoreme [Wadler, 1989]

Urspr¨ungliches Beispiel:

filter::(a→Bool)→[a]→[a]

F¨ur jede Wahl vonp,h undl gilt:

filterp (map h l) = map h (filter(p◦h) l) Bewiesen per Induktion.

Aber auch m¨oglich ohneInduktion!

(66)

takeWhile::(a→Bool)→[a]→[a]

F¨ur jede Wahl vonp,h undl gilt:

filterp (map h l) = map h (filter(p◦h) l) takeWhilep (map h l) = map h (takeWhile(p◦h)l)

(67)

Freie Theoreme [Wadler, 1989]

Urspr¨ungliches Beispiel:

filter::(a→Bool)→[a]→[a]

takeWhile::(a→Bool)→[a]→[a]

g::(a→Bool)→[a]→[a]

F¨ur jede Wahl vonp,h undl gilt:

filterp (map h l) = map h (filter(p◦h) l) takeWhilep (map h l) = map h (takeWhile(p◦h)l)

gp (map h l) = map h (g(p◦h) l)

(68)

takeWhile::(a→Bool)→[a]→[a]

g::(a→Bool)→[a]→[a]

F¨ur jede Wahl vonp,h undl gilt:

filterp (map h l) = map h (filter(p◦h) l) takeWhilep (map h l) = map h (takeWhile(p◦h)l)

gp (map h l) = map h (g(p◦h) l) Aber wie soll man so etwas beweisen k¨onnen?

(69)

Versuch einer Argumentation

• g:: (a→Bool)→[a]→[a] muss f¨ur jede m¨ogliche Instanziierung von aeinheitlich arbeiten.

(70)
(71)

Versuch einer Argumentation

• g:: (a→Bool)→[a]→[a] muss f¨ur jede m¨ogliche Instanziierung von aeinheitlich arbeiten.

• Die Ausgabeliste kann nur Elemente der Eingabe l enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

(72)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und dieErgebnisse vonp auf Elementen vonl.

(73)

Versuch einer Argumentation

• g:: (a→Bool)→[a]→[a] muss f¨ur jede m¨ogliche Instanziierung von aeinheitlich arbeiten.

• Die Ausgabeliste kann nur Elemente der Eingabe l enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und die Ergebnisse vonp auf Elementen vonl.

• Aber, die Listen (map h l) undl haben stetsdie selbe L¨ange.

(74)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und dieErgebnisse vonp auf Elementen vonl.

• Aber, die Listen (map h l) undl haben stets die selbe L¨ange.

• Und Anwendung vonp auf ein Element von (maph l) hat stetsdas selbe Ergebnis wie Anwendung von (p◦h) auf das entsprechende Element vonl.

(75)

Versuch einer Argumentation

• g:: (a→Bool)→[a]→[a] muss f¨ur jede m¨ogliche Instanziierung von aeinheitlich arbeiten.

• Die Ausgabeliste kann nur Elemente der Eingabe l enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und die Ergebnisse vonp auf Elementen vonl.

• Aber, die Listen (map h l) undl haben stets die selbe L¨ange.

• Und Anwendung vonp auf ein Element von (maph l) hat stets das selbe Ergebnis wie Anwendung von (p◦h) auf das entsprechende Element vonl.

• Also w¨ahlt gmitp stets

”die selben“ Elemente aus (maph l) wie es gmit (p◦h) aus l tut,

(76)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und die Ergebnisse vonp auf Elementen vonl.

• Aber, die Listen (map h l) undl haben stets die selbe L¨ange.

• Und Anwendung vonp auf ein Element von (maph l) hat stets das selbe Ergebnis wie Anwendung von (p◦h) auf das entsprechende Element vonl.

• Also w¨ahlt gmitp stets

”die selben“ Elemente aus (maph l) wie es gmit (p◦h) aus l tut,außer dass im ersten Fall die entsprechenden Abbilder unter h ausgegeben werden.

(77)

Versuch einer Argumentation

• g:: (a→Bool)→[a]→[a] muss f¨ur jede m¨ogliche Instanziierung von aeinheitlich arbeiten.

• Die Ausgabeliste kann nur Elemente der Eingabe l enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und die Ergebnisse vonp auf Elementen vonl.

• Aber, die Listen (map h l) undl haben stets die selbe L¨ange.

• Und Anwendung vonp auf ein Element von (maph l) hat stets das selbe Ergebnis wie Anwendung von (p◦h) auf das entsprechende Element vonl.

• Also w¨ahlt gmitp stets

”die selben“ Elemente aus (maph l) wie es gmit (p◦h) aus l tut, außer dass im ersten Fall die entsprechenden Abbilder unter h ausgegeben werden.

• Also ist (g (map )) gleich (map (g(p◦h) )).

(78)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von l und dem Eingabepr¨adikatp abh¨angen.

• Die einzig m¨oglichen Grundlagen zur Entscheidung sind die L¨ange von l und die Ergebnisse vonp auf Elementen vonl.

• Aber, die Listen (map h l) undl haben stets die selbe L¨ange.

• Und Anwendung vonp auf ein Element von (maph l) hat stets das selbe Ergebnis wie Anwendung von (p◦h) auf das entsprechende Element vonl.

• Also w¨ahlt gmitp stets

”die selben“ Elemente aus (maph l) wie es gmit (p◦h) aus l tut, außer dass im ersten Fall die entsprechenden Abbilder unter h ausgegeben werden.

• Also ist (g (map )) gleich (map (g(p◦h) )).

(79)

Geht es vielleicht etwas formaler?

Gegeben:

g:: (a→Bool)→[a]→[a]

Behauptung, f¨ur jede Wahl von p,h und l:

gp (maph l) = maph (g(p◦h)l)

(80)

gp (maph l) = maph (g(p◦h)l)

Wie w¨are es mit Induktion ¨uber den Syntaxaufbau von g?

(81)

Geht es vielleicht etwas formaler?

Gegeben:

g:: (a→Bool)→[a]→[a]

Behauptung, f¨ur jede Wahl von p,h und l:

gp (maph l) = maph (g(p◦h)l)

Wie w¨are es mit Induktion ¨uber den Syntaxaufbau von g?

Problem: l¨asst Typinformation außer Acht

(82)

gp (maph l) = maph (g(p◦h)l)

Wie w¨are es mit Induktion ¨uber den Syntaxaufbau von g?

Problem: l¨asst Typinformation außer Acht

Wie w¨are es dann mit Induktion nur ¨uber alle Funktionen des Typs (a→Bool)→[a]→[a]?

(83)

Geht es vielleicht etwas formaler?

Gegeben:

g:: (a→Bool)→[a]→[a]

Behauptung, f¨ur jede Wahl von p,h und l:

gp (maph l) = maph (g(p◦h)l)

Wie w¨are es mit Induktion ¨uber den Syntaxaufbau von g?

Problem: l¨asst Typinformation außer Acht

Wie w¨are es dann mit Induktion nur ¨uber alle Funktionen des Typs (a→Bool)→[a]→[a]?

Problem: dieser Bereich nicht kompositionell

(84)

gp (maph l) = maph (g(p◦h)l)

Wie w¨are es mit Induktion ¨uber den Syntaxaufbau von g?

Problem: l¨asst Typinformation außer Acht

Wie w¨are es dann mit Induktion nur ¨uber alle Funktionen des Typs (a→Bool)→[a]→[a]?

Problem: dieser Bereich nicht kompositionell

Wir m¨ussen also allgemein Aussagen der obigen Art f¨ur alle Typen gleichzeitig“ beweisen!

(85)

Geht es vielleicht etwas formaler?

Strategie:

• zu jedem Typ angeben, welche m¨oglichen Varianten (semantisch, nicht syntaktisch) von Elementen diesen Typs es gibt

(86)

(semantisch, nicht syntaktisch) von Elementen diesen Typs es gibt

• das Ganze m¨oglichst kompositionell ¨uber den Aufbau von Typen

(87)

Geht es vielleicht etwas formaler?

Strategie:

• zu jedem Typ angeben, welche m¨oglichen Varianten (semantisch, nicht syntaktisch) von Elementen diesen Typs es gibt

• das Ganze m¨oglichst kompositionell ¨uber den Aufbau von Typen

• sp¨ater per Induktion ¨uber die Syntax beweisen, dass jede Funktion die semantischen Einschr¨ankungen ihres Typs erf¨ullt

(88)

(semantisch, nicht syntaktisch) von Elementen diesen Typs es gibt

• das Ganze m¨oglichst kompositionell ¨uber den Aufbau von Typen

• sp¨ater per Induktion ¨uber die Syntax beweisen, dass jede Funktion die semantischen Einschr¨ankungen ihres Typs erf¨ullt

(89)

Erster Punkt an Beispielen

Frage: Welche Funktionen haben den Typ

”(a,a)→a“ ?

(90)
(91)

Erster Punkt an Beispielen

Frage: Welche Funktionen haben den Typ

”(a,a)→a“ ? Antwort: nur fstund snd(und semantisch ¨aquivalente)

(92)

Frage: Welche Funktionen haben den Typ

”a→a“ ?

(93)

Erster Punkt an Beispielen

Frage: Welche Funktionen haben den Typ

”(a,a)→a“ ? Antwort: nur fstund snd(und semantisch ¨aquivalente)

Frage: Welche Funktionen haben den Typ

”a→a“ ? Antwort: nur id

(94)

Frage: Welche Funktionen haben den Typ

”a→a“ ? Antwort: nur id

Frage: Welche Funktionen haben den Typ

”a→[a]“ ?

(95)

Erster Punkt an Beispielen

Frage: Welche Funktionen haben den Typ

”(a,a)→a“ ? Antwort: nur fstund snd(und semantisch ¨aquivalente)

Frage: Welche Funktionen haben den Typ

”a→a“ ? Antwort: nur id

Frage: Welche Funktionen haben den Typ

”a→[a]“ ? Antwort: f0,f1,f2, . . . , wobei:

f0 = [ ]

(96)

Frage: Welche Funktionen haben den Typ

”a→a“ ? Antwort: nur id

Frage: Welche Funktionen haben den Typ

”a→[a]“ ? Antwort: f0,f1,f2, . . . , wobei:

f0 = [ ] f1 a = [a]

(97)

Erster Punkt an Beispielen

Frage: Welche Funktionen haben den Typ

”(a,a)→a“ ? Antwort: nur fstund snd(und semantisch ¨aquivalente)

Frage: Welche Funktionen haben den Typ

”a→a“ ? Antwort: nur id

Frage: Welche Funktionen haben den Typ

”a→[a]“ ? Antwort: f0,f1,f2, . . . , wobei:

f0 = [ ] f1 a = [a]

f2 a = [a,a]

. . .

(98)

Frage: Welche Funktionen haben den Typ

”a→a“ ? Antwort: nur id

Frage: Welche Funktionen haben den Typ

”a→[a]“ ? Antwort: f0,f1,f2, . . . , wobei:

f0 = [ ] f1 a = [a]

f2 a = [a,a]

. . .

(99)

Welche M¨oglichkeiten gibt es f¨ur g :: [ a ] → [ a ] ?

Zun¨achst wieder intuitiv:

(100)
(101)

Welche M¨oglichkeiten gibt es f¨ur g :: [ a ] → [ a ] ?

Zun¨achst wieder intuitiv:

• Die Ausgabe- kann nurElemente der Eingabelisteenthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann lediglich von dieser Liste abh¨angen

(102)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann

lediglich von dieser Liste abh¨angen, und zwar von ihrer L¨ange.

(103)

Welche M¨oglichkeiten gibt es f¨ur g :: [ a ] → [ a ] ?

Zun¨achst wieder intuitiv:

• Die Ausgabe- kann nur Elemente der Eingabeliste enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann

lediglich von dieser Liste abh¨angen, und zwar von ihrer L¨ange.

• Folglich sind f¨ur eine feste Eingabel¨ange die L¨ange der

Ausgabeliste sowie die Anordnung der Elemente darin stets fix.

(104)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann

lediglich von dieser Liste abh¨angen, und zwar von ihrer L¨ange.

• Folglich sind f¨ur eine feste Eingabel¨ange die L¨ange der

Ausgabeliste sowie die Anordnung der Elemente darin stets fix.

Formal beschrieben:

F¨ur jedes g:: [a]→[a] gibt es:

(105)

Welche M¨oglichkeiten gibt es f¨ur g :: [ a ] → [ a ] ?

Zun¨achst wieder intuitiv:

• Die Ausgabe- kann nur Elemente der Eingabeliste enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann

lediglich von dieser Liste abh¨angen, und zwar von ihrer L¨ange.

• Folglich sind f¨ur eine feste Eingabel¨ange die L¨ange der

Ausgabelistesowie die Anordnung der Elemente darin stets fix.

Formal beschrieben:

F¨ur jedes g:: [a]→[a] gibt es:

• eine Funktionf :N→N, so dass f¨ur jedesn ∈Naus einer Liste der L¨ange n mitgstets eine Liste der L¨angef(n) wird;

(106)

• Welche, und in welcher Reihenfolge/Vielfachheit, kann

lediglich von dieser Liste abh¨angen, und zwar von ihrer L¨ange.

• Folglich sind f¨ur eine feste Eingabel¨ange die L¨ange der

Ausgabeliste sowie dieAnordnung der Elemente darinstets fix.

Formal beschrieben:

F¨ur jedes g:: [a]→[a] gibt es:

• eine Funktionf :N→N, so dass f¨ur jedesn ∈Naus einer Liste der L¨ange n mitgstets eine Liste der L¨angef(n) wird;

• eine Funktionh :N×N→N, so dass f¨ur jede Liste einer L¨angen ∈Nund f¨ur jedes 0≤m<f(n), das m-te Element der Ausgabeliste das h(n,m)-te Element der Eingabeliste ist.

(107)

Welche M¨oglichkeiten gibt es f¨ur g :: [ a ] → [ a ] ?

Zun¨achst wieder intuitiv:

• Die Ausgabe- kann nur Elemente der Eingabeliste enthalten.

• Welche, und in welcher Reihenfolge/Vielfachheit, kann

lediglich von dieser Liste abh¨angen, und zwar von ihrer L¨ange.

• Folglich sind f¨ur eine feste Eingabel¨ange die L¨ange der

Ausgabeliste sowie die Anordnung der Elemente darin stets fix.

Formal beschrieben:

F¨ur jedes g:: [a]→[a] gibt es:

• eine Funktionf :N→N, so dass f¨ur jedesn ∈Naus einer Liste der L¨ange n mitgstets eine Liste der L¨angef(n) wird;

• eine Funktionh :N×N→N, so dass f¨ur jede Liste einer L¨angen ∈Nund f¨ur jedes 0≤m<f(n), das m-te Element der Ausgabeliste das h(n,m)-te Element der Eingabeliste ist.

(108)

(semantisch, nicht syntaktisch) von Elementen diesen Typs es gibt

• das Ganze m¨oglichst kompositionell ¨uber den Aufbau von Typen

• sp¨ater per Induktion ¨uber die Syntax beweisen, dass jede Funktion die semantischen Einschr¨ankungen ihres Typs erf¨ullt

Referenzen

ÄHNLICHE DOKUMENTE

UBUNGSAUFGABEN ¨ Mathematik f¨ ur Wirtschaftsingenieure und -informatiker. SERIE 2

Auch wenn wir so manche Hoffnung, Erwartung – ja Forderung – nicht, nicht mehr oder noch nicht erfüllen können, so hat die Medizin bis heute eine grandiose Ent- wicklung

3-1) Der Regisseur stellt ein Pult auf die Bühne. 3-2) Der Regisseur stellt dem Direktor eine Frage. So handelt es sich bei Beispiel 3-1) um die Vollverblesart des Funktionsverbs

• sp¨ater per Induktion ¨uber die Syntax beweisen, dass jede Funktion die semantischen Einschr¨ankungen ihres Typs

• sp¨ater per Induktion ¨uber die Syntax beweisen, dass jede Funktion die semantischen Einschr¨ankungen ihres Typs

• sp¨ater per Induktion ¨uber die Syntax beweisen, dass jede Funktion die semantischen Einschr¨ankungen ihres Typs erf¨ullt... Unerw¨unschte Ad-Hoc-Polymorphie

F¨ ur die Unterr¨ aume X h , M h sei bekannt, dass sie die Brezzi-Bedingungen erf¨ ullen. Welche der Bedingungen m¨ ussen jeweils neu gepr¨

Welche der Bedingungen m¨ ussen jeweils neu gepr¨ uft werden. Besprechung in den ¨ Ubungen