This commit is contained in:
Leon Vatthauer 2024-04-30 12:31:24 +02:00
parent 01ebc0a315
commit fe0f8a6744
Signed by: leonv
SSH key fingerprint: SHA256:G4+ddwoZmhLPRB1agvXzZMXIzkVJ36dUYZXf5NxT+u8
3 changed files with 40 additions and 17 deletions

View file

@ -27,4 +27,5 @@ push: all
mv -T agda-intro public
Everything.agda:
rm -f src/Everything.agda
git ls-files | egrep '^src/[^\.]*.l?agda(\.md)?' | sed -e 's|^src/[/]*|import |' -e 's|/|.|g' -e 's/.agda//' -e '/import Everything/d' -e 's/..md//' | LC_COLLATE='C' sort >> src/Everything.agda

View file

@ -1,5 +1 @@
import Intro
import Intro
import Intro
import Intro
import Intro

View file

@ -1,6 +1,6 @@
# Funktionale Programmierung in Agda
In dieser Datei werden wir einen kleinen Blick in funktionale Programmierung mit Agda wagen.
Agda ist eine funktionale Programmiersprache wie Haskell,
Agda ist eine funktionale Programmiersprache deren Syntax der von Haskell sehr ähnlich ist,
jedoch besitzt Agda ein deutlich ausdrucksstärkeres Typsystem durch sogenannte *dependent types*.
Das sind Typen welche von Termen der Programmiersprache abhängen können, aber dazu in späteren Kapiteln mehr.
@ -24,11 +24,12 @@ Wir werden vor allem bekanntes Wissen aus ThProg anwenden und hier implementiere
### Recall: Lambda-Kalkül
Der (ungetypte) Lambda-Kalkül ist die Grundlage jeder funktionalen Programmiersprache.
Ein Term des Lambda-Kalküls ist entweder
- Eine Variable x ∈ V
- Eine Applikation zweier Lambda Terme t₁t₂
- Eine Lambda-Abstraktion λx.t, wobei x ∈ V und t Term.
Diese drei Komponenten finden wir deshalb in jeder funktionalen Programmiersprache, wobei in der Regel Syntaxzucker für Lambda-Abstraktionen angeboten wird (die übliche Funktionsnotation).
- Eine Variable *x ∈ V*
- Eine Applikation zweier Lambda Terme *t₁ t₂*
- Eine Lambda-Abstraktion *λx.t*, wobei *x ∈ V* und *t* Term.
Diese drei Komponenten finden wir deshalb in jeder funktionalen Programmiersprache, wobei in der Regel Syntaxzucker für Lambda-Abstraktionen angeboten wird. D.h. *f x = b* ist Syntaxzucker für *λ x → b*.
Applikation in Agda ist klar, einfach das hintereinanderschreiben von Termen, Abstraktion wird geschrieben als 'λ x → t'.
@ -57,9 +58,6 @@ Agda implementiert induktive Datentypen genau so wie wir sie in ThProg kennengel
data 𝔹 : Type where
tt : 𝔹
ff : 𝔹
{-# BUILTIN BOOL 𝔹 #-}
{-# BUILTIN TRUE tt #-}
{-# BUILTIN FALSE ff #-}
```
#### Aufgabe 3
@ -95,21 +93,27 @@ foldb t s b = _
data : Type where
zero :
succ :
{-# BUILTIN NATURAL #-} -- Hierdurch können wir einfach '0, 1, 2, ...' statt 'zero, succ zero, succ (succ zero), ...' schreiben, wir bekommen aber **keine** Funktionen wie z.B. Addition geschenkt!
{-# BUILTIN NATURAL #-} -- Hierdurch können wir einfach '0, 1, 2, ...' statt 'zero, succ zero, succ (succ zero), ...' schreiben. Wir bekommen aber **keine** Funktionen wie z.B. Addition geschenkt!
```
#### Aufgabe 7
Definiere die Additionsfunktion auf natürlichen Zahlen.
Definiere Funktionen zur Addition und Subtraktion natürlicher Zahlen.
```agda
add :
add n m = _
sub :
sub n m = _
```
#### Aufgabe 8
Definiere eine Subtraktionsfunktion.
Definiere Funktionen `odd` und `even`, welche testen ob eine natürliche Zahl gerade oder ungerade ist.
```agda
sub :
sub n m = _
odd : 𝔹
odd n = _
even : 𝔹
even n = _
```
#### Aufgabe 9
@ -119,6 +123,28 @@ foldn : ∀ {C : Type} → C → (C → C) → → C
foldn c h n = _
```
#### Optionale Aufgaben
##### Optionale Aufgabe 1
Definiere `add'` und `sub'` mittels `foldn` (*ohne* pattern matching).
```agda
add' :
add' = _
sub' :
sub' = _
```
##### Optionale Aufgabe 2
Definiere `odd'` und `even'` mittels `foldn` (*ohne* pattern matching).
```agda
odd' : 𝔹
odd' = _
even' : 𝔹
even' = _
```
### Listen
```agda