Zorunlu Programlama'da Prolog'un neden SQL'den daha az popüler olduğuna dair tarihsel emsal? [kapalı]


12

Yazma gibi görünüyor Declarative SQL çok popüler olan Emir Programlama . Ancak, aynı zamanda yazılı görünüyor Declarative Prolog karmaşıklık tasarrufu yapabilirsiniz ama bu çok yaygın değildir.

Prolog yerine SQL'in bu belirgin tercihi için tarihsel bir emsal var mı?

Nedeni Zorunlu diller tarafından yerel desteğin bulunmaması ise , dil yaratıcılarının Prologilk etapta yerel olarak desteklemeyi neden yararlı bulamadıklarını cevaplamak mümkün müdür ?


Bazı spesifik örnekler sunmak için:

Örnek 1
Bir kredi başvurusunun değerlendirilmesi, yalnızca birkaç satır kodlu sorgu Prologgibi SELECT/JOINbirkaç satır kod olabilir SQL, ancak avantajı o kadar açık değildir SQL.

Örnek 2
İşte başka bir örnek problem ve Prolog çözümü. Aşağıdaki kısıtlama mantık programı, john'un öğretmen olarak tarihinin basitleştirilmiş bir veri kümesini temsil eder :

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.

Aşağıdaki hedef fıkra zaman john hem öğretilen öğrenmek için veri kümesini sorgular mantığı ve oldu profesörü :

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

Sonuç:

2010  T, T  2012.

Yukarıdaki örnekte SQLaynı sonucu elde etmek kolay olacaktır . Ancak, bu verilerin bir Array. O zaman aynı sonuçları kullanarak o kadar kolay değil SQL. Ve bir dizide saklanan veri durumunda, Prolog kodunun yazılması ve bakımı daha kolay olacağına inanıyorum.


8
Rant yönünü çevirmek isteyebilirsiniz.

4
Metnin çoğu Prolog kullanmayan insanlara karşı bir rant gibi geliyor. İçinde sormaya değer bir soru var, ama diğer şeyler (rant) aşağı oyları çekiyor ve bir cevaba katkıda bulunabilecek insanları kapatıyor. Başka bir deyişle, sorunuzu daha hayırsever bir şekilde ifade etmeyi denemenizi öneririm.

6
"Örneğin bir kredi başvurusunu değerlendirmek Prolog sadece birkaç satır kod olabilir" Bunu satın almıyorum, tuz değerinde herhangi bir uygulama aynı tonlarca özel yapılmış veya oluşturulan SQL sorguları kullanır.
Euphoric

7
Belki bir şey eksik, ama bence buradaki cevap 'insanlar SQL kullanıyor çünkü veritabanlarının desteklediği şey' .
GrandmasterB

3
Onlar do Kullanım Prolog ... şey ... aslında ... onlar yapmak kullanım kuralları Motorları vardır, "ad hoc, Prolog yarısının gayri-belirtilen böcek basmış, yavaş uygulama" .
Jörg W Mittag

Yanıtlar:


19

Bunun öncelikle tarihsel bir şey olduğuna inanıyorum.

SQL öncelikle iş uygulamalarında iş uygulamaları için kullanıldı. Bazı şirketler canlılıklarını SQL çözümleri satma üzerine kuruyorlar ve paralarını SQL'i reklam vermek ve birçoğunun zihnine itmek için kullandılar. Bu özellikle verilerin iş adamları için ne kadar önemli olduğu ile güçlendirildi. Bu yüzden SQL birçok rakibini kazandı ve bugün bile çok yaygın olarak biliniyor ve kullanılıyor.

Öte yandan prolog çoğunlukla akademik alanda, genellikle yapay zeka alanında biliniyordu. Akademik insanlar nadiren araçlarını ve fikirlerini başkalarının yaptığı gibi iş dünyasına zorlarlar. Genellikle bazı şirketlerin ortak geliştiriciler arasında yayılması için akademide doğan bir teknolojinin reklamını yapması gerekir. Ayrıca, veriler son derece önemli olmakla birlikte, "iş kuralları" böyle değildir. Önemli görünseler de verilerden çok daha az önemlidir. İş kuralları genellikle kolayca düzeltilebilir. "Bozuk" verileri düzeltmeye çalışmak genellikle daha zor bir sorundur. Bu nedenle işletmeler, iş çözümleri çözümlerinden çok veri çözümlerini almaya odaklanmışlardır.


2
"Genellikle bazı şirketlerin ortak geliştiriciler arasında yayılması için akademide doğan bir teknolojinin reklamını yapması gerekir.": Doğru. Akademide birçok iyi fikir geliştirilir ve daha sonra pazarlama gücüne sahip şirketler tarafından popüler hale getirilir. +1
Giorgio

6

Nedeni aslında oldukça basit. Belirli bir görev için dilin ne kadar yararlı olduğu ve kodun ne kadar sürdürülebilir olduğu ile ilgili hiçbir şey yoktur.

Bir SQL deyimini okuyan birçok geliştirici, dili bilmeden en temel sorguların ne yapacağını belirleyebilecektir. Karmaşık örneklerde daha zor zamanlar geçirebilirler, ancak mevcut kodu uyarlamak veya örneklerden çalışmak nispeten kolaydır. Anlayışın önündeki engel, sorguların büyük çoğunluğu için oldukça düşüktür.

Birkaç satır prolog okuyorsunuz ve birçok geliştirici biraz şaşı olacak ve görevi başka biri için bırakacak ve muhtemelen bir uzanmaya gidecek. Prologun sözdizimi sadece kolay okumaya borç vermez.

Güncelleme:

Kod örneğine göre, koleksiyonları uygulayan diller iyi çalışmalıdır. C # / Linq'de bir çözüm uyguladım ve prolog örneğinden önemli ölçüde daha büyük değildi (bir kez statik yazım ve gerekli tanımları hesaba kattığınızda). Aranacak tek bir zaman çizelgesi oluşturmak için listeleri birleştirmek için bazı geçici çalışmalarda fazladan bir adım vardı, ancak bu önemli bir çalışma değildi.


14
SQL'in, okumayı “kolay” hale getiren COBOL sınıfı ultra ayrıntılı ve “doğal” sözdizimi için yaptığı doğrudur. Ancak SQL bilmeyen birisinin birkaç joins veya count(*)benzeri bir şeyle orta karmaşık bir ifadeyi düzgün bir şekilde anlayabileceğinden şüpheliyim . SQL'in temellerini anlarsak, zaman zaman bu dili kullanmamız gerektiğinden bu temelleri öğrenmek zorunda kaldık. İlişkisel veri depolama, mantık sistemlerini çözmekten çok daha yaygın bir ihtiyaçtır, bu nedenle Prolog'un kendini göstermesi için nispeten güçlü bir gereklilik yoktur.
amon

3
@amon Bu iyi bir cevabın başlangıcı gibi geliyor :-)
svick

1
Okunabilirlik nedeniyle SQL öğrenme engeli azaltılabilir, prolog sözdizimi nedeniyle insanları savuşturur, tamamen buna katılıyorum. Ama aslında, SQL anlama alt sorguları ve birkaç birleştirmeleri bilmeden o kadar da önemsiz değildir. Ancak basit sorgularla başlarken alt engel, insanların başlamak için Prolog yerine SQL'i kullanmasının bir sebebidir. :)
Dylan Meeus

4
@JamesSnell Üzgünüm ama -1. İddia ettiğiniz hiçbir RegEx ile eşleşmiyor . ^(?:(?:(?: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 şifreli, yazması zor, hata ayıklama, bakım ve değiştirme ya da genişletme, ancak son derece popüler. Haklıysanız, RegEx, geliştiriciler ve dil yaratıcıları arasındaki mevcut popülerliklerini asla almamış olmalıydı.
53777A

4

Başka bir sebep daha var. Pratik olarak, SQL diskte kalıcı veriler için kullanışlıdır. Bu nedenle veritabanları, verileri "uzun" bir süre (birkaç ay) saklamak için kullanılır. Her SQL veritabanı (örn. PostgreSQL, MySQL, Oracle, ....) disklerdeki verileri (veya SSD'leri, yani doğru şekilde kapatıldıklarında verileri tutabilecek donanımları) yönetmektedir. Bununla birlikte, farkında olduğum çoğu Prolog uygulaması bellekte çalışmaktadır ve verileri güvenilir bir şekilde tutmak için kullanılamaz (veriler elektrik kesintisinden sonra, en azından programlanmış olandan sonra da kalıcıdır). Ve SQL uygulamaları terabaytlarca veri ile başa çıkabilir ....

Tabii ki, bir DBMS hemen diske yazmaz (ancak daha sonra). Ama duyduğum Prolog tercümanları, gerçeklerini ve kurallarını asla diske ısıtmak için (örtük olarak) yazmıyorlar.

(Bazı dil uygulamaları kalıcılık yeteneğine sahiptir, örneğin SBCL ile save-lisp-and-die... ama bunu yapan hiçbir Prolog bilmiyorum).

Pragmatik olarak konuşursak, SQL diskler üzerindeki veritabanları içindir, ancak Prolog bir programlama dilidir (metin dosyalarındaki kaynak kodu için).


1
Ben öyle düşünmüyorum, çünkü hiçbir SQL veritabanı kesinlikle disk I / O ile çalışmadığından, bu çok verimsiz olacaktır (her zaman bellekte bazı veriler vardır) ve diske prolog kısıtlamalarını serileştirmek için teknik bir engel yok Şu anda düşünebilir.
idoby

3
Teorik olarak, SQL bir sorgulama dilidir ve veriler ilişkisel bir model tarafından tanımlandığı sürece verilerin nasıl saklandığını umursamaz. SQL sadece bir arayüzdür, bir paradigma değildir. Kalıcı olmayan bellekte tamamen veya kısmen çalışan SQL kullanan veritabanları vardır. SQL kullanan bir veritabanının verileri Prolog gerçekleri şeklinde depolaması bile mümkün olabilir! Sonuçta, olgular sadece ilişkileri tanımlar. Tersine, muhtemelen bir Prolog motorunun gerçekleri her şeyi belleğe yüklemek yerine veritabanına benzer bir şekilde diskte depolaması mümkün olabilir.
amon

1
Teorik olarak evet, ancak pratik olarak SQL diskte depolanıyor ve bu genellikle gerekli
Basile Starynkevitch

1
@BasileStarynkevitch Kurallar ve Gerçekler diskte var olan kaynak koduna yazılır. Bunları neden veritabanında depolasın ki? Prolog'un veriyi tutamaması ne demek istiyorsun? Bunu yapması gerekmiyor. Bu yüzden veritabanları var. Daha fazla ayrıntı verebilir misiniz?
53777A

1
SQL, veritabanları içindir ve Prolog bir programlama dilidir. Demek istediğim bu.
Basile Starynkevitch

1

Şimdiye kadar bahsedilmeyen bir husus, 1980'lerde ve 1990'larda "açık" sistemlere yönelik baskıdır. Birçok yerde, yazılım satıcılarının veritabanlarındaki verilere endüstri standardı erişim sağlamaları gerekir. O zamanlar SQL iyi bilinen ve anlaşılan yerleşik bir standarttı; Prolog oldukça ezoterik ve akademikti. Sistemleri kolayca bağlamak için ODBC gibi arayüzler almaya başladığınızda, hiç kimse diğer teknolojilere bakmakla ilgilenmiyordu.

80'li yılların sonlarında, bir SQL arayüzü eklemek için piyasa baskıları / tedarik düzenlemeleri tarafından zorlanan oldukça başarılı bir ISAM veritabanına sahip bir yerde çalıştım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.