In der Informatik ist die deklarative Programmierung ein Programmierparadigma , das die Logik einer Berechnung ausdrückt , ohne deren Kontrollfluss vollständig zu beschreiben . [ 1 ]
Sprachen, die diesen Stil zulassen, ermöglichen es Entwicklern, Seiteneffekte zu minimieren oder zu eliminieren, indem sie beschreiben, was das Programm im Hinblick auf die Problemdomäne leisten soll , anstatt die Umsetzung als Folge von Programmiersprachenprimitiven detailliert zu beschreiben (die konkrete Implementierung obliegt der jeweiligen Sprachimplementierung ). Dies steht im Gegensatz zur imperativen Programmierung , die Algorithmen in expliziten Schritten implementiert . [ 2 ] [ 3 ]
Die deklarative Programmierung kann Programme als Theorien einer formalen Logik und Berechnungen als Deduktionen dieser logischen Theorie betrachten. Die deklarative Programmierung vereinfacht mitunter das Schreiben paralleler Programme . [ 4 ]
Zu den gängigen deklarativen Sprachparadigmen gehören die logische Programmierung (z. B. Prolog , Datalog , Answer Set Programming ) und algebraische Modellierungssysteme .
Definition
Deklarative Programmierung wird oft als jeder Programmierstil definiert, der nicht imperativ ist. Eine Reihe anderer gängiger Definitionen versucht, sie durch einen einfachen Gegensatz zur imperativen Programmierung zu definieren. Zum Beispiel:
- Ein übergeordnetes Programm, das beschreibt, was eine Berechnung leisten soll.
- Jede Programmiersprache, die keine Seiteneffekte hat , oder genauer gesagt, die referenzielle Transparenz aufweist .
- Eine Sprache mit einer klaren Entsprechung zur mathematischen Logik . [ 5 ]
Diese Definitionen überschneiden sich erheblich.
Deklarative Programmierung ist ein nicht-imperativer Programmierstil, bei dem Programme ihre gewünschten Ergebnisse beschreiben, ohne Befehle oder auszuführende Schritte explizit aufzulisten. Logische Programmiersprachen zeichnen sich durch einen überwiegend deklarativen Programmierstil aus. In der logischen Programmierung bestehen Programme aus Sätzen in logischer Form, und die Berechnung verwendet diese Sätze, um Probleme zu lösen, die ebenfalls in logischer Form ausgedrückt werden.
In einer rein funktionalen Sprache wie Haskell haben alle Funktionen keine Seiteneffekte , und Zustandsänderungen werden ausschließlich durch Funktionen dargestellt, die den Zustand transformieren. Dieser Zustand wird explizit als Objekt erster Klasse im Programm repräsentiert. Obwohl rein funktionale Sprachen nicht-imperativ sind, bieten sie oft die Möglichkeit, die Wirkung einer Funktion als Folge von Schritten zu beschreiben. Andere funktionale Sprachen wie Lisp , OCaml und Erlang unterstützen eine Mischung aus prozeduraler und funktionaler Programmierung.
Einige logische Programmiersprachen, wie Prolog , und Datenbankabfragesprachen, wie SQL, sind zwar im Prinzip deklarativ, unterstützen aber auch einen prozeduralen Programmierstil.
Subparadigmen
Deklarative Programmierung ist ein Oberbegriff , der eine Reihe bekannterer Programmierparadigmen umfasst .
Constraint-Programmierung
Die Constraint-Programmierung beschreibt Beziehungen zwischen Variablen in Form von Constraints, die die Eigenschaften der Ziellösung festlegen. Die Constraints werden gelöst , indem jeder Variable ein Wert zugewiesen wird, sodass die Lösung mit der maximalen Anzahl an Constraints übereinstimmt. Die Constraint-Programmierung ergänzt häufig andere Paradigmen wie die funktionale, logische oder auch imperative Programmierung.
Hybridsprachen
Makefiles beispielsweise spezifizieren Abhängigkeiten deklarativ [ 6 ] , enthalten aber auch eine imperative Liste auszuführender Aktionen. Ähnlich spezifiziert yacc eine kontextfreie Grammatik deklarativ, bindet aber Code-Snippets aus einer Hostsprache ein, die üblicherweise imperativ ist (wie z. B. C ).
Logikprogrammierung
Logische Programmiersprachen wie Prolog , Datalog und Answer-Set-Programmierung berechnen Ergebnisse, indem sie beweisen, dass ein Ziel eine logische Konsequenz des Programms ist, oder indem sie zeigen, dass das Ziel in einem durch das Programm definierten Modell wahr ist. Prolog berechnet Ergebnisse, indem es Ziele in Teilziele zerlegt (Top-Down-Ansatz mit Rückwärtslogik ), während die meisten Datalog-Systeme Bottom-Up-Ansatz mit Vorwärtslogik verwenden . Answer-Set-Programme nutzen typischerweise SAT-Solver, um ein Modell des Programms zu generieren.
Modellieren
Modelle oder mathematische Darstellungen physikalischer Systeme lassen sich in deklarativem Computercode implementieren. Dieser Code enthält Gleichungen anstelle von imperativen Zuweisungen, die die Verhaltensbeziehungen beschreiben („deklarieren“). Durch die Verwendung dieses Formalismus kann ein Computer algebraische Manipulationen durchführen, um den Lösungsalgorithmus optimal zu formulieren. Die mathematische Kausalität wird typischerweise an den Grenzen des physikalischen Systems definiert, während die Verhaltensbeschreibung des Systems selbst deklarativ oder akausal ist. Beispiele für deklarative Modellierungssprachen und -umgebungen sind Analytica , Modelica und Simile . [ 7 ]
Beispiele
Prolog
Prolog (1972) steht für „PROgramming in LOGic“. Es wurde für die Beantwortung von Fragen in natürlicher Sprache entwickelt [ 8 ] und verwendet SL-Resolution [ 9 ] sowohl zum Ableiten von Antworten auf Anfragen als auch zum Parsen und Generieren von Sätzen in natürlicher Sprache.
Die Bausteine eines Prolog-Programms sind Fakten und Regeln . Hier ist ein einfaches Beispiel:
Katze ( Tom ). % Tom ist eine Katze. Maus ( Jerry ). % Jerry ist eine Maus.Tier ( X ) : Katze ( X ). % Jede Katze ist ein Tier. Tier ( X ) : Maus ( X ). % Jede Maus ist ein Tier.groß ( X ) :- Katze ( X ). % Jede Katze ist groß. klein ( X ) :- Maus ( X ). % Jede Maus ist klein.eat ( X , Y ) : Maus ( X ), Käse ( Y ). % Jede Maus frisst jeden Käse. eat ( X , Y ) : Groß ( X ), Klein ( Y ). % Jedes große Wesen frisst jedes kleine Wesen.Bei diesem Programm ist die Anfrage erfolgreich, während sie fehlschlägt. Darüber hinaus ist die Anfrage mit der Antwortsubstitution erfolgreich . eat(tom,jerry)eat(jerry,tom)eat(X,jerry)X=tom
Prolog führt Programme von oben nach unten aus und nutzt die SLD-Resolution, um rückwärts zu argumentieren und Ziele auf Teilziele zu reduzieren. In diesem Beispiel verwendet es die letzte Regel des Programms, um das Ziel, die Anfrage zu beantworten, auf die Teilziele zu reduzieren: zuerst ein X zu finden, sodass gilt, und dann zu zeigen, dass gilt. Es verwendet wiederholt Regeln, um Teilziele weiter auf andere Teilziele zu reduzieren, bis es schließlich gelingt, alle Teilziele mit Fakten im Programm zu vereinheitlichen . Diese Strategie des rückwärtsgerichteten Denkens und der Zielreduktion behandelt Regeln in Logikprogrammen als Prozeduren und macht Prolog sowohl zu einer deklarativen als auch zu einer prozeduralen Programmiersprache . [ 10 ]eat(X,jerry)big(X)small(jerry)
Die breite Palette an Prolog-Anwendungen wird im Buch „Year of Prolog“ [ 11 ] hervorgehoben, das anlässlich des 50-jährigen Jubiläums von Prolog erscheint.
Datenprotokoll
Die Ursprünge von Datalog reichen bis zu den Anfängen der logischen Programmierung zurück, doch erst um 1977 wurde es als eigenständiges Gebiet etabliert . Syntaktisch und semantisch ist es eine Teilmenge von Prolog. Da es jedoch keine zusammengesetzten Terme unterstützt , ist es nicht Turing-vollständig .
Die meisten Datalog-Systeme führen Programme von unten nach oben aus, indem sie Regeln verwenden, um vorwärts zu argumentieren , neue Fakten aus bestehenden Fakten abzuleiten und zu beenden, wenn keine neuen Fakten mehr abgeleitet werden können oder wenn die abgeleiteten Fakten mit der Abfrage übereinstimmen.
Datalog wurde bereits für Probleme wie Datenintegration , Informationsextraktion , Netzwerktechnik , Sicherheit , Cloud Computing und maschinelles Lernen eingesetzt . [ 12 ] [ 13 ]
Antwortmengenprogrammierung
Answer Set Programming (ASP) entwickelte sich Ende der 1990er Jahre auf Basis der stabilen Modellsemantik (Antwortmengensemantik) der logischen Programmierung. Wie Datalog ist es eine Teilmenge von Prolog; und da es keine zusammengesetzten Terme unterstützt, ist es nicht Turing-vollständig.
Die meisten Implementierungen von ASP führen ein Programm aus, indem sie zunächst das Programm grundieren , alle Variablen in den Regeln auf alle möglichen Arten durch Konstanten ersetzen und dann einen propositionalen SAT-Solver wie den DPLL-Algorithmus verwenden, um ein oder mehrere Modelle des Programms zu generieren.
Seine Anwendungsgebiete zielen auf die Lösung schwieriger Suchprobleme und die Wissensrepräsentation ab . [ 14 ] [ 15 ]
Siehe auch
Referenzen
- ^ Lloyd, JW (19.–22. September 1994). „Praktische Vorteile der deklarativen Programmierung“ (PDF) . In: Alpuente, María; Barbuti, Roberto; Ramos, Isidro (Hrsg.). GULP-PRODE’94 1994 Joint Conference on Declarative Programming . Band I. Peñíscola , Spanien. S. 3–17 .
- ^ Sebesta, Robert (2016). Konzepte von Programmiersprachen . Boston: Pearson. ISBN 978-0-13-394302-3OCLC 896687896 .
- ^ „Imperative Programmierung: Überblick über das älteste Programmierparadigma“ . IONOS Digital Guide . 21.05.2021. Archiviert vom Original am 03.05.2022 . Abgerufen am 23.05.2023 .
- ^ „DAMP 2009: Workshop on Declarative Aspects of Multicore Programming“ . Cse.unsw.edu.au. 20. Januar 2009. Archiviert vom Original am 13. September 2013. Abgerufen am 15. August 2013 .
- ^ Chakravarty, Manuel MT (14. Februar 1997). Zur massiv parallelen Ausführung deklarativer Programme (Dissertation). Technische Universität Berlin . Archiviert vom Original am 23. September 2015. Abgerufen am 26. Februar 2015. In diesem Kontext ist das Kriterium für die Bezeichnung einer Programmiersprache als deklarativ das Vorhandensein einer klaren, mathematisch begründeten Korrespondenz zwischen der Sprache und der mathematischen Logik ,
sodass eine deklarative Semantik für die Sprache auf dem Modell oder der Beweistheorie (oder beidem) der Logik basieren kann.
- ^ „Ein Überblick über DSLs“ . Archiviert vom Original am 23. Oktober 2007.
- ^ „Deklarative Modellierung“ . Simulistics. Archiviert vom Original am 11. August 2003. Abgerufen am 15. August 2013 .
- ^ „Birth of Prolog“ (PDF) . November 1992. Archiviert (PDF) vom Original am 2. April 2015. Abgerufen am 25. Mai 2022 .
- ^ Robert Kowalski; Donald Kuehner (Winter 1971). „Lineare Resolution mit Selektionsfunktion“ (PDF) . Künstliche Intelligenz . 2 ( 3–4 ): 227–260 . doi : 10.1016/0004-3702(71)90012-9 . ISSN 0004-3702 . Archiviert (PDF) vom Original am 23.09.2015 . Abgerufen am 13.08.2023 .
- ^ Robert Kowalski, Prädikatenlogik als Programmiersprache. Archiviert am 7. Februar 2016 im Internet Archive . Memo 70, Department of Artificial Intelligence, University of Edinburgh, 1973. Auch in: Proceedings IFIP Congress, Stockholm, North Holland Publishing Co., 1974, S. 569–574.
- ^ Warren, DS (2023). „Einführung in Prolog“. In: Warren, DS; Dahl, V; Eiter, T; Hermenegildo, MV; Kowalski, R.; Rossi, F. (Hrsg.). Prolog: Die nächsten 50 Jahre . Lecture Notes in Computer Science (LNCS). Band 13900. Springer, Cham. S. 3–19 . doi : 10.1007/978-3-031-35254-6_1 . ISBN 978-3-031-35253-9Die
- ^ Huang, Shan Shan; Green, Todd J.; Loo, Boon Thau (12.–16. Juni 2011). Datalog und neue Anwendungen (PDF) . SIGMOD 2011. Athen, Griechenland: Association for Computing Machinery. ISBN 978-1-4503-0661-4Archiviert ( PDF) vom Original am 22.10.2020 . Abgerufen am 13.08.2023 .
- ^ Mei, Hongyuan; Qin, Guanghui; Xu, Minjie; Eisner, Jason (2020). „Neuronales Datalog im Zeitverlauf: Informierte temporale Modellierung mittels logischer Spezifikation“. Proceedings of ICML 2020. arXiv : 2006.16723 .
- ^ Baral, Chitta (2003). Wissensrepräsentation, Schlussfolgerung und deklarative Problemlösung . Cambridge University Press. ISBN 978-0-521-81802-5Die
- ^ Gelfond, Michael (2008). „Antwortmengen“ . In: van Harmelen, Frank; Lifschitz, Vladimir; Porter, Bruce (Hrsg.). Handbuch der Wissensrepräsentation . Elsevier. S. 285–316 . ISBN 978-0-08-055702-1DieAls PDF archiviert am 03.03.2016 in der Wayback Machine
Externe Links
- Frans Coenen. Charakteristika deklarativer Programmiersprachen . 1999.
- Robert Harper .
- Olof Torgersson. Eine Anmerkung zu deklarativen Programmierparadigmen und der Zukunft der definitorischen Programmierung . 1996.