Precedenti storici per cui Prolog è meno popolare di SQL nella programmazione imperativa? [chiuso]


12

Sembra che scrivere Declarative SQL sia molto popolare nella programmazione imperativa . Tuttavia, sembra anche che scrivere Declarative Prolog potrebbe salvare molta complessità, ma questo non è molto comune.

Esiste un precedente storico per questa apparente preferenza di SQL rispetto a Prolog?

Se la ragione è la mancanza di supporto nativo da parte delle lingue imperative , allora è possibile rispondere perché i creatori di lingue non hanno trovato utile sostenere nativamente Prologin primo luogo?


Per fornire alcuni esempi specifici:

Esempio 1 La
valutazione di un'applicazione di prestito potrebbe consistere in poche righe di codice Prolog, come la SELECT/JOINquery che contiene solo poche righe di codice SQL, ma sembra che il vantaggio non sia così ovvio SQL.

Esempio 2
Ecco un altro problema di esempio e la soluzione in Prolog. Il seguente programma di logica dei vincoli rappresenta un set di dati semplificato della storia di John come insegnante:

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.

La seguente clausola obiettivo interroga il set di dati per scoprire quando John insegnava la logica ed era un professore :

:- teaches(john, logic, T), rank(john, professor, T).

Risultato:

2010  T, T  2012.

Nell'esempio sopra sarà facile SQLottenere lo stesso risultato. Ma supponiamo di avere questi dati in un Array. Quindi non è così facile ottenere gli stessi risultati usando SQL. E nel caso dei dati archiviati in un array, credo che il codice Prolog sarà più facile da scrivere e mantenere.


8
Potresti voler comporre l'aspetto rant.

4
La maggior parte del testo sembra un rant contro le persone che non usano Prolog. C'è una domanda che merita di essere contenuta in essa, ma l'altra roba (il rant) attira i voti negativi e spegne le persone che potrebbero contribuire con una risposta. In altre parole, ti suggerisco di provare a formulare la tua domanda in un modo più benefico.

6
"Ad esempio, la valutazione di un'applicazione di prestito potrebbe essere solo alcune righe di codice in Prolog" Non lo compro, per lo stesso motivo per cui qualsiasi applicazione che valga la pena sale utilizzerà tonnellate di query SQL personalizzate o generate.
Euforico,

7
Forse mi manca qualcosa, ma penso che la risposta qui sia "le persone usano SQL perché è quello che supportano i database" .
GrandmasterB,

3
Essi fanno uso Prolog ... beh ... in realtà ... loro fanno uso Regole Motori , che sono "ad hoc, in modo informale specificato, piena di bachi, lenta attuazione della metà del Prolog" .
Jörg W Mittag,

Risposte:


19

Credo che questa sia principalmente una cosa storica.

SQL è stato utilizzato principalmente nelle aziende per creare applicazioni aziendali. Alcune aziende sviluppano la loro vitalità nella vendita di soluzioni SQL e hanno usato i loro soldi per pubblicizzare e spingere SQL nella mente di molti. Ciò è stato particolarmente potenziato dall'importanza dei dati per gli uomini d'affari. Questo è il motivo per cui SQL ha conquistato molti concorrenti ed è così conosciuto e utilizzato ancora oggi.

D'altra parte Prolog era per lo più conosciuto nella sfera accademica, di solito nell'area dell'intelligenza artificiale. Le persone accademiche raramente spingono i loro strumenti e idee sugli altri in un modo che gli affari fanno. Di solito è necessario che alcune aziende pubblicizzino una tecnologia nata in ambito accademico affinché si diffonda tra gli sviluppatori comuni. Inoltre, sebbene i dati siano estremamente importanti, le "regole aziendali" non lo sono. Sebbene possano sembrare importanti, sono molto meno importanti dei dati. Le regole aziendali possono di solito essere risolte facilmente. Cercare di correggere i dati "rotti" di solito è un problema molto più difficile. Quindi le aziende si sono concentrate molto di più sull'ottenere le loro soluzioni di dati rispetto alle loro soluzioni di regole aziendali.


2
"Di solito è necessario che alcune aziende pubblicizzino una tecnologia che è nata nel mondo accademico per diffondersi tra gli sviluppatori comuni": True. Molte buone idee vengono sviluppate in ambito accademico e successivamente rese popolari da aziende che hanno il potere di marketing per farlo. +1
Giorgio,

6

Il motivo è in realtà piuttosto semplice. Non ha nulla a che fare con quanto sia utile la lingua per una determinata attività e tutto con quanto sia gestibile il codice.

Leggendo un'istruzione SQL, molti sviluppatori saranno in grado di determinare cosa fanno la maggior parte delle query di base senza conoscere la lingua. Potrebbero avere tempi più difficili nel caso di esempi complessi, ma adattare il codice esistente o lavorare con gli esempi è relativamente semplice. La barriera alla comprensione è piuttosto bassa per la stragrande maggioranza delle domande.

Leggete alcune righe di prologo e molti sviluppatori passeranno un po 'inosservati e lasceranno il compito a qualcun altro, e magari andranno a sdraiarsi. La sintassi predicata di prolog semplicemente non si presta alla lettura facile.

Aggiornare:

Sulla base dell'esempio di codice, le lingue che implementano le raccolte dovrebbero fare bene. Ho implementato una soluzione in C # / Linq e non era significativamente più grande del campione di prologo (una volta che hai tenuto conto della tipizzazione statica e delle definizioni richieste). C'è stato un ulteriore passo in più in alcuni lavori provvisori per unire gli elenchi per creare una singola sequenza temporale da cercare, ma non è stata una quantità significativa di lavoro.


14
È vero che SQL ha optato per una sintassi ultra-verbosa e "naturale" di grado COBOL che la rende "facile" da leggere. Ma dubito fortemente che qualcuno che non conosce SQL sarebbe in grado di comprendere correttamente un'affermazione medio-complicata con qualche joins count(*)o qualcosa del genere. Se capiamo le basi di SQL è perché occasionalmente dobbiamo usare quel linguaggio e quindi abbiamo dovuto imparare queste basi. L'archiviazione dei dati relazionali è un'esigenza molto più comune della risoluzione dei sistemi logici, quindi non si presenta alcuna necessità relativamente forte per apprendere Prolog.
amon,

3
@amon Sembra l'inizio di una buona risposta :-)
svick

1
La barriera per l'apprendimento di SQL potrebbe essere abbassata a causa della leggibilità, il prologo potrebbe respingere le persone a causa della sintassi, sono completamente d'accordo. Ma in effetti, senza conoscere le sottoquery di SQL e alcuni join non è così banale. Ma la barriera inferiore quando si inizia con query semplici è sicuramente un motivo per cui le persone userebbero SQL invece di Prolog per iniziare. :)
Dylan Meeus il

4
@JamesSnell Siamo spiacenti ma -1. Quello che stai rivendicando non corrisponde a nessun RegEx . ^(?:(?:(?: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})$.
53777A

1
@JamesSnell RegEx sono criptici, difficili da scrivere, eseguire il debug, mantenere e modificare o estendere, ma sono estremamente popolari. Se avessi ragione, allora RegEx non avrebbe mai dovuto ottenere la loro attuale popolarità tra sviluppatori e creatori di lingue.
53777A

4

C'è un'altra ragione. In pratica, SQL è utile per i dati persistenti su disco. Quindi i database vengono utilizzati per archiviare i dati per un tempo "lungo" (diversi mesi). Ogni database SQL (ad esempio PostgreSQL, MySQL, Oracle, ....) gestisce i dati su dischi (o SSD, ovvero hardware che potrebbe conservare i dati se correttamente spento). Tuttavia, la maggior parte delle implementazioni di Prolog di cui sono a conoscenza funzionano in memoria e non possono essere utilizzate per mantenere i dati in modo affidabile (dati persistenti dopo un'interruzione di corrente, almeno programmata). E le implementazioni SQL possono gestire terabyte di dati ....

Naturalmente, un DBMS non scrive immediatamente sul disco (ma in seguito). Ma gli interpreti di Prolog di cui ho sentito parlare non scrivono mai (implicitamente) i loro fatti e le loro basi per perseverarli su disco.

(Alcune implementazioni linguistiche hanno capacità di persistenza, ad esempio SBCL con save-lisp-and-die... ma non conosco Prolog che lo faccia).

Pragmaticamente parlando, SQL è per database -su dischi-, ma Prolog è un linguaggio di programmazione (per il codice sorgente in file testuali).


1
Non credo, dal momento che nessun database SQL funziona strettamente con l'I / O del disco, in quanto sarebbe molto inefficiente (ci sono sempre dei dati in memoria in ogni momento) e non c'è alcun impedimento tecnico alla serializzazione dei vincoli del prologo sul disco che io posso pensare al momento.
idoby

3
Teoricamente parlando, SQL è un linguaggio di query e non si preoccupa del modo in cui i dati vengono archiviati, purché i dati siano descritti da un modello relazionale. SQL è solo un'interfaccia, non un paradigma. Esistono database che utilizzano SQL che funzionano esclusivamente o parzialmente nella memoria non persistente. Sarebbe anche possibile per un database che utilizza SQL archiviare i dati sotto forma di fatti Prolog! [citazione necessaria] Dopo tutto, i fatti descrivono semplicemente le relazioni. Al contrario, sarebbe probabilmente possibile per un motore Prolog archiviare i fatti in modo simile a un database su disco anziché caricare tutto in memoria.
amon,

1
Teoricamente sì, ma praticamente SQL sta archiviando su disco, e questo è spesso essenziale
Basile Starynkevitch

1
Le regole e i fatti di @BasileStarynkevitch sono scritti sul codice sorgente che persiste sul disco. Perché invece li memorizzeresti nel database? Cosa intendi con Prolog non può conservare i dati? Non dovrebbe farlo. Ecco perché esistono i database. Potresti per favore elaborare di più.
53777A

1
Esatto, SQL è per database e Prolog è un linguaggio di programmazione. Questo è il mio punto.
Basile Starynkevitch l'

1

Un aspetto non menzionato finora è la spinta verso sistemi "aperti" negli anni '80 e '90. In molti luoghi, i fornitori di software dovrebbero fornire un accesso standard ai dati dei loro database. All'epoca, SQL era uno standard consolidato che era ben noto e compreso; Prolog era piuttosto esoterico e accademico. Una volta che hai iniziato a ottenere interfacce come ODBC per connettere facilmente i sistemi, nessuno era interessato a guardare altre tecnologie.

Ho lavorato in un posto alla fine degli anni '80 che aveva un database ISAM di grande successo che era stato costretto dalle pressioni del mercato / regolamenti sugli appalti ad aggiungere un'interfaccia SQL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.