Es scheint, dass das Schreiben von Deklarativen SQL
in der Imperativen Programmierung sehr beliebt ist . Es scheint jedoch auch, dass das Schreiben von Declarative Prolog
eine Menge Komplexität einsparen könnte, aber dies ist nicht sehr häufig.
Gibt es einen historischen Präzedenzfall für diese offensichtliche Präferenz von SQL gegenüber Prolog?
Wenn der Grund für die mangelnde native Unterstützung durch imperative Sprachen liegt, ist es dann möglich zu beantworten, warum die Sprachentwickler es nicht für nützlich hielten, native Unterstützung überhaupt zu bieten Prolog
?
Um einige spezifische Beispiele bereitzustellen:
Beispiel 1 Die
Bewertung eines Kreditantrags kann nur wenige Codezeilen umfassen Prolog
, wie die SELECT/JOIN
Abfrage, die nur wenige Codezeilen enthält. SQL
Der Vorteil ist jedoch offensichtlich nicht so offensichtlich wie SQL
.
Beispiel 2
Hier ist ein weiteres Beispielproblem und die Lösung in Prolog. Das folgende Constraint-Logik-Programm repräsentiert einen vereinfachten Datensatz von Johns Geschichte als Lehrer:
teaches(john, hardware, T) :- 1990 ≤ T, T < 1999.
teaches(john, software, T) :- 1999 ≤ T, T < 2005.
teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012.
rank(john, instructor, T) :- 1990 ≤ T, T < 2010.
rank(john, professor, T) :- 2010 ≤ T, T < 2014.
Die folgende Zielklausel fragt den Datensatz ab, um herauszufinden, wann John sowohl Logik unterrichtet hat als auch Professor war :
:- teaches(john, logic, T), rank(john, professor, T).
Ergebnis:
2010 ≤ T, T ≤ 2012.
Im obigen Beispiel ist es einfach SQL
, dasselbe Ergebnis zu erzielen. Angenommen, Sie haben diese Daten in einem Array
. Dann ist es nicht so einfach, die gleichen Ergebnisse zu erzielen SQL
. Und im Fall von Daten, die in einem Array gespeichert sind, glaube ich, dass der Prolog-Code einfacher zu schreiben und zu warten ist.
quelle
Antworten:
Ich glaube, das ist in erster Linie eine historische Sache.
SQL wurde hauptsächlich in Unternehmen zur Erstellung von Geschäftsanwendungen verwendet. Einige Unternehmen bauen ihre Lebendigkeit auf dem Verkauf von SQL-Lösungen auf und verwendeten ihr Geld, um für SQL zu werben und es vielen vorzustellen. Dies wurde insbesondere dadurch ermöglicht, wie wichtig Daten für Geschäftsleute sind. Aus diesem Grund hat SQL viele Mitbewerber für sich gewonnen und ist bis heute weithin bekannt und verbreitet.
Prolog hingegen war vor allem im akademischen Bereich, meist im Bereich der künstlichen Intelligenz, bekannt. Akademiker schieben selten ihre Werkzeuge und Ideen auf eine geschäftliche Weise auf andere. Normalerweise muss ein Unternehmen für eine Technologie werben, die in der Wissenschaft geboren wurde, damit sie sich unter den üblichen Entwicklern verbreitet. Auch wenn Daten extrem wichtig sind, sind die "Geschäftsregeln" dies nicht. Obwohl sie wichtig erscheinen mögen, sind sie viel weniger wichtig als Daten. Geschäftsregeln können in der Regel einfach festgelegt werden. Der Versuch, "kaputte" Daten zu reparieren, ist normalerweise ein viel schwierigeres Problem. Daher konzentrierten sich Unternehmen viel mehr darauf, ihre Datenlösungen als ihre Geschäftsregellösungen zu erhalten.
quelle
Der Grund ist eigentlich ziemlich einfach. Es hat nichts damit zu tun, wie nützlich die Sprache für eine bestimmte Aufgabe ist und wie wartbar der Code ist.
Wenn Sie eine SQL-Anweisung lesen, können viele Entwickler feststellen, was die meisten grundlegenden Abfragen tun, ohne die Sprache zu kennen. Bei komplexen Beispielen fällt es ihnen möglicherweise schwerer, vorhandene Codes anzupassen oder anhand von Beispielen zu arbeiten, ist jedoch relativ einfach. Die Barriere für das Verständnis ist für die überwiegende Mehrheit der Anfragen recht niedrig.
Sie lesen ein paar Zeilen des Prologs, und viele Entwickler werden die Aufgabe leicht verschränken und sie einem anderen überlassen und sich möglicherweise hinlegen. Die Prädikatsyntax von Prolog ist einfach nicht einfach zu lesen.
Aktualisieren:
Basierend auf dem Codebeispiel sollten Sprachen, die Auflistungen implementieren, gut funktionieren. Ich habe eine Lösung in C # / Linq implementiert, die nicht wesentlich größer war als das Prolog-Beispiel (nachdem Sie die statische Typisierung und die erforderlichen Definitionen berücksichtigt hatten). In einigen vorläufigen Arbeiten war ein zusätzlicher Schritt erforderlich, um die Listen zu einer einzigen Zeitachse zusammenzuführen, die durchsucht werden musste. Dies war jedoch kein nennenswerter Arbeitsaufwand.
quelle
join
scount(*)
oder etwas Ähnlichem richtig verstehen kann. Wenn wir die Grundlagen von SQL verstehen, liegt das daran, dass wir gelegentlich diese Sprache verwenden müssen und daher diese Grundlagen lernen müssen. Relationale Datenspeicherung ist ein weitaus häufigerer Bedarf als das Lösen von Logiksystemen, so dass sich keine vergleichsweise starke Notwendigkeit ergibt, Prolog zu erlernen.^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
.Es gibt noch einen anderen Grund. In der Praxis ist SQL nützlich für Daten, die auf der Festplatte gespeichert sind. Daher werden Datenbanken verwendet, um Daten für einen "langen" Zeitraum (mehrere Monate) zu speichern. Jede SQL-Datenbank (z. B. PostgreSQL, MySQL, Oracle usw.) verwaltet Daten auf Datenträgern (oder SSDs, dh Hardware, die bei ordnungsgemäßem Herunterfahren Daten speichern kann). Die meisten mir bekannten Prolog-Implementierungen arbeiten jedoch im Arbeitsspeicher und können nicht zum zuverlässigen Speichern von Daten verwendet werden (Daten bleiben nach einem Stromausfall erhalten, zumindest nach einem programmierten). Und SQL-Implementierungen können mit Terabytes an Daten umgehen.
Natürlich schreibt ein DBMS nicht sofort (aber später) auf die Festplatte. Aber die Prolog-Interpreten, von denen ich gehört habe, schreiben niemals (implizit) ihre Fakten- und Regelgrundlagen, um sie auf der Festplatte zu belassen.
(Einige Sprachimplementierungen haben Persistenzfähigkeiten, z. B. SBCL mit
save-lisp-and-die
..., aber ich kenne keinen Prolog, der das tut).Pragmatisch gesehen ist SQL für Datenbanken gedacht - auf Datenträgern -, aber Prolog ist eine Programmiersprache (für Quellcode in Textdateien).
quelle
Ein Aspekt, der bisher nicht erwähnt wurde, ist der Drang nach "offenen" Systemen in den 1980er und 1990er Jahren. An vielen Orten müssten Softwareanbieter einen branchenüblichen Zugriff auf die Daten in ihren Datenbanken bereitstellen. Zu dieser Zeit war SQL ein etablierter Standard, der gut bekannt und verstanden war. Prolog war ziemlich esoterisch und akademisch. Als Sie anfingen, Schnittstellen wie ODBC für die einfache Verbindung von Systemen zu entwickeln, war niemand mehr daran interessiert, andere Technologien in Betracht zu ziehen.
Ich habe Ende der 80er Jahre an einem Ort gearbeitet, an dem eine recht erfolgreiche ISAM-Datenbank vorhanden war, die aufgrund von Marktdruck / Beschaffungsvorschriften gezwungen war, eine SQL-Schnittstelle hinzuzufügen.
quelle