Table Of ContenteXamen.press
eXamen.press isteineReihe,dieTheorieund
PraxisausallenBereichender Informatikfür
dieHochschulausbildungvermittelt.
Wolfram-Manfred Lippe
Funktionale und Applikative
Programmierung
Grundlagen, Sprachen,
Implementierungstechniken
Prof.Dr.Wolfram-ManfredLippe
UniversitätMünster
InstitutfürInformatik
Einsteinstr.62
48149Münster
[email protected]
ISBN 978-3-540-89091-1 e-ISBN 978-3-540-89108-6
DOI10.1007/978-3-540-89108-6
eXamen.pressISSN1614-5216
BibliografischeInformationderDeutschenNationalbibliothek
DieDeutscheBibliothekverzeichnetdiesePublikationinderDeutschenNationalbibliografie;
detailliertebibliografischeDatensindimInternetüberhttp://dnb.d-nb.deabrufbar.
LibraryofCongressControlNumber:2008940420
(cid:2)c 2009Springer-VerlagBerlinHeidelberg
DiesesWerkisturheberrechtlichgeschützt.DiedadurchbegründetenRechte,insbesonderediederÜber-
setzung,desNachdrucks,desVortrags,derEntnahmevonAbbildungenundTabellen,derFunksendung,
der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenver-
arbeitungsanlagen,bleiben,auchbeinurauszugsweiserVerwertung,vorbehalten.EineVervielfältigung
diesesWerkesodervonTeilendiesesWerkesistauchimEinzelfallnurindenGrenzendergesetzlichen
BestimmungendesUrheberrechtsgesetzesderBundesrepublikDeutschlandvom9.September1965in
der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen
unterliegendenStrafbestimmungendesUrheberrechtsgesetzes.
DieWiedergabevonGebrauchsnamen,Handelsnamen,Warenbezeichnungenusw.indiesemWerkbe-
rechtigtauchohnebesondereKennzeichnungnichtzuderAnnahme,dasssolcheNamenimSinneder
Warenzeichen-undMarkenschutz-Gesetzgebungalsfreizubetrachtenwärenunddahervonjedermann
benutztwerdendürften.
Herstellung:VTEXtypesettingandelectronicpublishingservices,Vilnius
Einbandgestaltung:KünkelLopka,Heidelberg
GedrucktaufsäurefreiemPapier
987654321
springer.com
Vorwort
In den vergangenen Jahren hat die applikative Programmierung, die auch
oft als funktionale Programmierung bezeichnet wird, in der Forschung eine
schwunghafte Entwicklung genommen. Nachdem in der industriellen Praxis
dieapplikativeProgrammierspracheLISPsichbereitsseitvielenJahreneinen
festenPlatzeroberthat,istzuerwarten,daßauchdieneuenEntwicklungenim
BereichderfunktionalenundapplikativenProgrammierungaufzunehmendes
Interesse stoßen werden.
Das Hauptanliegen dieses Buches ist eine leicht verst¨andliche Einfu¨hrung
in die vielschichtige Thematik. Sie reicht von theoretischen Hilfsmitteln wie
dem λ-Kalku¨l u¨ber Implementierungsfragen bis hin zu neuen Rechnerarchi-
tekturen. Angesichts der Stoffu¨lle mußte eine Auswahl getroffen werden und
mußtenSchwerpunktegesetztwerden.AlsZugangzurThematikundalsBin-
deglied zwischen den einzelnen Kapiteln wurde der ungetypte λ-Kalku¨l von
ChurchmitderklassischenReduktionssemantikbzw.diekombinatorischeLo-
gik gew¨ahlt. Im Hauptteil geht es um die Vorstellung funktionaler und appli-
kativer Programmiersprachen, um Beispiele fu¨r diesen Programmierstil und
umeffizienteImplementierungstechniken.Dieetwasst¨arkereFokussierungauf
dienichtmehrganzaktuelleSpracheLISPistdarinbegru¨ndet,daßmitPure-
LISP eine kompakte Kernsprache zur Verfu¨gung steht, die ohne zus¨atzlichen
Ballast“ eine einfache didaktische Einfu¨hrung in die verschiedenen Problem-
”
bereiche erlaubt. Im abschließenden Teil wird dargelegt, wie sich derartige
Programmiersprachen zuku¨nftig auf die Entwicklung neuer Rechner auswir-
ken k¨onnen, die nicht mehr auf der von Neumann-Architektur beruhen. Bei
dieser Abgrenzung des Stoffes werden im Vertrauen auf andere vorhandene
bzw. noch erscheinende Lehrbu¨cher interessante Themen, die nicht nur spezi-
ell die funktionale und applikative Programmierung betreffen, nur in geringe-
rem Umfang beru¨cksichtigt, so z.B. die Fixpunkttheorie und die Theorie der
abstraktenDatentypen.DieDarstellungdesaktuellenStandesderrasantvor-
anschreitendenForschungistTagungsb¨andenvorbehalten.Dieregelm¨aßigvon
der amerikanischen Gesellschaft ACM veranstalteten Tagungen u¨ber Func-
”
tional Programming“ geben einen guten U¨berblick.
VI Vorwort
Das Material dieses Buches beruht auf Vorlesungen und begleitenden
U¨bungen,dieinKiel,Mu¨nchenundMu¨nstergehaltenwurden.BeiderAusar-
beitungderzugrundeliegendenVorlesungsskriptenwurdeaufdieDarstellung
desUmfangsdereinzelnenVorlesungenundderAufteilungineinzweistu¨ndi-
ges Zeitraster zugunsten einer Gliederung nach inhaltlichen Gesichtspunkten
verzichtet.
Wenn man ein solches Buch schreibt, macht man Fehler. Sollten Sie als
Leser Fehler in diesem Buch finden, so wu¨rde ich mich freuen, wenn Sie mir
dies mitteilen wu¨rden, damit diese Fehler in folgenden Auflagen korrigiert
werden k¨onnen.
Der Autor m¨ochte den vielen Personen, die dieses Vorhaben unterstu¨tzt
haben, ihren Dank sagen, insbesondere D. Ackermann, W. Dosch, E. Fehr,
K.-U. Felgentreu, Wolfgang Goerigk, D. Hillen, B. Kalhoff, W. Kluge, M.
Krause, E. Meyer, Th. Feuring, D. Lammers und F. Simon die Teile des Ma-
nuskripts gelesen und wertvolle Hinweise gegeben haben. Frau I. Berg, Frau
M.-L. Giesa und Frau M. Gentes gilt besonderer Dank fu¨r die hervorragende
ArbeitbeimSchreibenderDruckvorlagenundihreGeduldbeimEinfu¨gender
Verbesserungen und Erweiterungen, ebenso Herrn S. Isik fu¨r die Erstellung
der Endkorrektur und die U¨berarbeitung der Abbildungen.
Mu¨nster, W.-M. Lippe
Mai 2008
Inhaltsverzeichnis
1 Einleitung ................................................. 1
2 Mathematische Grundlagen................................ 9
2.1 Berechenbare Funktionen ................................ 9
2.1.1 Einleitung........................................ 9
2.1.2 Primitiv-rekursive Funktionen....................... 11
2.1.3 Primitiv-rekursive Pr¨adikate ........................ 14
2.1.4 Partiell rekursive Funktionen ....................... 16
2.1.5 Vergleich der betrachteten Klassen von Funktionen .... 18
2.1.6 Effektive Bereiche ................................. 19
2.2 Der λ-Kalku¨l ........................................... 23
2.2.1 Einleitung........................................ 23
2.2.2 Der klassische λ-Kalku¨l ............................ 25
2.2.2.1 Elementare Begriffe ....................... 26
2.2.2.2 Reduktionsregeln des λ-Kalku¨ls............. 31
2.2.2.3 Extensionale Gleichheit von Funktionen...... 32
2.2.2.4 Die Church-Rosser Eigenschaft ............. 34
2.2.3 Wahrheitswerte und logische Verknu¨pungen........... 39
2.2.4 Arithmetik und λ-Definierbarkeit.................... 40
2.2.5 Terme mit undefinierter Bedeutung.................. 45
2.2.6 Fixpunkte ........................................ 48
2.2.7 Reduktionsstrategien .............................. 50
2.2.8 Angewandter λ-Kalku¨l ............................. 53
2.2.9 Typsysteme ...................................... 54
2.2.9.1 Getypter λ-Kalku¨l ........................ 55
2.2.9.2 Abstrakte Datentypen .................... 57
2.2.9.3 Polymorphie ............................. 60
2.3 Kombinatorische Logik................................... 62
2.3.1 Einleitung........................................ 62
2.3.2 Elementare Begriffe................................ 62
VIII Inhaltsverzeichnis
2.3.3 Die Beziehung zum λ-Kalku¨l........................ 68
2.3.4 Anwendungen der kombinatorischen Logik............ 69
3 Programmiersprachen ..................................... 73
3.1 FP-systeme............................................. 73
3.1.1 Einleitung........................................ 73
3.1.2 Schemasprache.................................... 74
3.1.3 Ein FP-System.................................... 76
3.1.4 Beispiele fu¨r FP-Programme ........................ 79
3.1.5 Die Algebra der FP-Programme..................... 86
3.1.6 FFP-Systeme ..................................... 92
3.1.7 Beispiele fu¨r FFP-Programme....................... 94
3.1.8 FP-Programme als Kombinatoren ................... 97
3.2 LISP...................................................108
3.2.1 Einleitung........................................108
3.2.2 Pure-LISP........................................109
3.2.2.1 Daten ...................................109
3.2.2.2 Basisfunktionen zur Verarbeitung von
S-Ausdru¨cken ............................111
3.2.2.3 Vereinfachte Darstellung
aufeinanderfolgender car‘s und cdr‘s .........112
3.2.2.4 Basispr¨adikate fu¨r S-Ausdru¨cke .............112
3.2.2.5 Bedingte Ausdru¨cke .......................113
3.2.2.6 Abstraktionen und Applikationen ...........113
3.2.2.7 Rekursive Lambda-Ausdru¨cke ..............114
3.2.2.8 Funktionale ..............................114
3.2.2.9 Zusammenfassung der Syntax ..............115
3.2.2.10 U¨bersetzung von Programmen der
M-Sprache in S-Ausdru¨cke .................116
3.2.2.11 Beispiele.................................117
3.2.2.12 Der Interpretierer .........................121
3.2.2.13 Interpretation eines Beispiels ...............124
3.2.3 LISP-Programmiersysteme .........................126
3.2.3.1 Datenstrukturen ..........................127
3.2.3.2 Pseudofunktionen .........................131
3.2.3.3 Standardfunktionen .......................133
3.2.3.4 Konzeptionelle Erweiterungen ..............134
3.2.3.5 Die INTERLISP-Programmierumgebung.....137
3.2.4 Kuriosit¨aten ......................................141
3.2.5 Die Beziehung zum λ-Kalku¨l........................143
3.2.5.1 LISP als angewandter λ-Kalku¨l .............143
3.2.5.2 Der Interpretierer eval1....................144
3.2.5.3 Der Interpretierer eval2....................146
3.2.5.4 Statische und dynamische Bindung von
Variablen ................................148
Inhaltsverzeichnis IX
3.2.5.5 Der Interpretierer eval3....................149
3.2.5.6 Der Interpretierer eval4....................151
3.3 Weitere Applikative Programmiersprachen..................154
3.3.1 Einleitung........................................154
3.3.2 SASL ............................................155
3.3.3 KRC ............................................160
3.3.4 EFPL............................................169
3.3.5 BRL.............................................172
3.3.5.1 Sprachbeschreibung .......................172
3.3.5.2 Ein Programm zur Unifikation von Termen...179
3.3.6 Scheme ..........................................187
3.3.6.1 Datentypen ..............................187
3.3.6.2 Globale Definitionen.......................188
3.3.6.3 Lokale Deklarationen ......................189
3.3.6.4 Prozeduren...............................193
3.3.6.5 Fallunterscheidungen ......................194
3.3.6.6 Rekursionen..............................196
3.3.6.7 Programmierbeispiele......................197
3.3.6.8 Scheme-Systeme ..........................200
3.3.7 Miranda..........................................201
3.3.8 Haskell...........................................206
3.3.8.1 Sprachkonzepte ...........................207
3.3.8.2 Das Typsystem ...........................212
3.3.8.3 Beispielprogramme........................221
3.3.9 ML..............................................222
3.3.9.1 Entwicklung..............................222
3.3.9.2 Sprachelemente ...........................223
3.3.10 Hope ............................................229
3.3.11 Curry............................................234
3.3.11.1 Einfu¨hrung...............................234
3.3.11.2 Sprachkonzepte ...........................235
3.3.11.3 Ein Programmbeispiel .....................237
3.3.12 Weitere Sprachen..................................238
3.3.12.1 ASpecT .................................238
3.3.12.2 Caml....................................239
3.3.12.3 Cayenne .................................239
3.3.12.4 CELP ...................................239
3.3.12.5 Clean ...................................239
3.3.12.6 Eden ....................................240
3.3.12.7 Erlang...................................240
3.3.12.8 Escher...................................241
3.3.12.9 FALCON ................................241
3.3.12.10 Goffin ...................................242
3.3.12.11 λ-Prolog .................................243
3.3.12.12 L ......................................243
λ
X Inhaltsverzeichnis
3.3.12.13 Leda ....................................243
3.3.12.14 Mercury .................................244
3.3.12.15 Oz ......................................245
3.3.12.16 Scala ....................................245
3.3.12.17 TyPiCal .................................246
4 Implementierungstechniken................................247
4.1 Interpretierer ...........................................247
4.1.1 Einleitung........................................247
4.1.2 Shallow-Binding...................................249
4.1.3 Optimierung von einfachen Postrekursionen...........257
4.1.4 Optimierung von verdeckten Postrekursionen .........260
4.2 U¨bersetzer..............................................265
4.2.1 Einleitung........................................265
4.2.2 Ein Laufzeitsystem mit kellerartiger
Speicherplatzverwaltung............................267
4.2.3 Optimierungen....................................272
4.3 Hardware – Unterstu¨tzte Implementierungen................278
4.3.1 Einleitung........................................278
4.3.1.1 Reduktionsmaschinen......................279
4.3.1.2 Datenflußmaschinen .......................283
4.3.2 Die GMD-Reduktionsmaschine (Berkling-Maschine) ...291
4.3.2.1 Einleitung ...............................291
4.3.2.2 Der interne Aufbau der GMD-Maschine......293
4.3.2.3 Kooperierende Reduktionsmaschinen ........303
4.3.3 Die S-K-I-Graph-Reduktionsmaschine von Turner .....307
4.3.3.1 Einleitung ...............................307
4.3.3.2 U¨bersetzung von SASL-Programmen ........308
4.3.3.3 Der Graph Reduktionsmechanismus .........313
4.3.4 Die Manchester-Datenflußmaschine ..................324
4.3.4.1 Einleitung ...............................324
4.3.4.2 Rechnerstruktur ..........................330
Literaturverzeichnis ...........................................337
Sachverzeichnis ................................................351