Öncelikle, ince pw0n1e simgeniz için size iltifat etmeme izin verin.
Bu, cevaplanması zor bir sorudur, çünkü hem miniKanren hem de Prolog'un pek çok çeşidi vardır. miniKanren ve Prolog gerçekten dil aileleridir, bu da özelliklerini ve hatta pratikte nasıl kullanıldıklarını karşılaştırmayı zorlaştırır. Bu nedenle, lütfen söyleyeceğim her şeyi dikkatli bir şekilde alın: Prolog'un derinlemesine arama kullandığını söylersem, birçok Prolog uygulamasının diğer arama stratejilerini desteklediğini ve alternatif arama stratejilerinin metada da kodlanabileceğini unutmayın. - tercüman seviyesi. Yine de miniKanren ve Prolog'un farklı tasarım felsefeleri var ve farklı ödünleşimler yapıyorlar.
Prolog, sembolik yapay zeka programlama için iki klasik dilden biridir (diğer klasik dil Lisp'tir). Prolog, bildirim temelli bilginin birinci dereceden mantıkla kodlandığı sembolik kural tabanlı sistemleri uygulamada mükemmeldir. Dil, bazen mantıksal saflık pahasına, bu tür uygulamalar için ifade ve verimlilik için optimize edilmiştir. Örneğin, varsayılan olarak Prolog birleştirmede "gerçekleşme denetimini" kullanmaz. Matematik / mantık açısından, bu birleştirme versiyonu yanlıştır. Bununla birlikte, meydana gelen kontrol pahalıdır ve çoğu durumda gerçekleşen kontrolün olmaması bir problem değildir. Bu çok pragmatik bir tasarım kararıdır, tıpkı Prolog'un derinlik aramasını ve kesim kullanımını kullanması gibi (!
) geri izlemeyi kontrol etmek için. 1970'lerin donanımı üzerinde çalışırken bu kararların kesinlikle gerekli olduğundan eminim ve bugün büyük problemler üzerinde çalışırken ve çok büyük (genellikle sonsuz!) Arama alanlarıyla uğraşırken çok yararlıdır.
Prolog, aritmetik kullanım için değişkenlerin kesilmesi assert
ve retract
projeksiyonu dahil olmak üzere birçok "ekstra mantıksal" veya "mantıksız" özelliği destekleris
vb. Bu özelliklerin çoğu, karmaşık kontrol akışını ifade etmeyi ve Prolog'un küresel gerçekler veritabanını değiştirmeyi kolaylaştırır. Prolog'un çok ilginç bir özelliği, Prolog kodunun kendisinin küresel veri veritabanında saklanması ve çalışma zamanında sorgulanabilmesidir. Bu, yorumlama altında Prolog kodunun davranışını değiştiren meta yorumlayıcılar yazmayı önemsiz hale getirir. Örneğin, arama sırasını değiştiren bir meta-yorumlayıcı kullanarak Prolog'da genişlik-ilk aramayı kodlamak mümkündür. Bu, Prolog dünyasının dışında pek bilinmeyen son derece güçlü bir tekniktir. 'Prolog Sanatı' bu tekniği ayrıntılı olarak anlatır.
Çoğu Warren Abstract Machine (WAM) üzerine kurulu olan Prolog uygulamalarını iyileştirmek için büyük çaba harcanmıştır. WAM, değerlerin mantık değişkenlerine yıkıcı bir şekilde atandığı ve bu yan etkilerin geri izleme üzerine geri alındığı bir yan etki modeli kullanır. WAM'ın talimatlarını genişleterek Prolog'a birçok özellik eklenebilir. Bu yaklaşımın bir dezavantajı, WAM hakkında sağlam bir anlayış olmadan Prolog uygulama belgelerinin okunmasının zor olabilmesidir. Öte yandan, Prolog uygulayıcısı, uygulama sorunlarını tartışmak için ortak bir modele sahiptir. Paralel Prolog'da, 1990'larda Andorra Prolog'da doruğa ulaşan çok sayıda araştırma yapıldı. Bu fikirlerin en azından bazıları Ciao Prolog'da yaşıyor. (Ciao Prolog, çoğu Prolog standardının çok ötesine geçen ilginç fikirlerle doludur.)
Prolog, çok kısa ve öz programlarla sonuçlanan güzel bir birleştirme tabanlı "kalıp eşleştirme" tarzı sözdizimine sahiptir. Prologlar sözdizimlerini severler, tıpkı Lispers'ın s-ifadelerini sevmesi gibi. Prolog ayrıca geniş bir standart yüklem kitaplığına sahiptir. WAM'ı hızlı hale getirmek için harcanan tüm mühendislik nedeniyle, çok yetenekli ve olgun Prolog uygulamaları var. Sonuç olarak, birçok büyük bilgi tabanlı sistem tamamen Prolog'da yazılmıştır.
miniKanren, küçük, kolay anlaşılır ve kolayca hacklenebilir bir uygulama ile minimal bir mantık programlama dili olarak tasarlanmıştır. miniKanren başlangıçta Scheme'ye yerleştirilmişti ve son on yılda düzinelerce başka ana dile aktarıldı. En popüler miniKanren uygulaması Clojure'daki "core.logic" dir ve şu anda birçok Prolog benzeri uzantıya ve bir dizi optimizasyona sahiptir. Son zamanlarda miniKanren uygulamasının çekirdeği daha da basitleştirilerek "microKanren" adı verilen küçük bir "mikro çekirdek" ortaya çıktı. miniKanren daha sonra bu microKanren çekirdeğinin üzerine uygulanabilir. MicroKanren veya miniKanren'i yeni bir ana bilgisayar diline taşımak, miniKanren öğrenen programcılar için standart bir egzersiz haline geldi. Sonuç olarak,
MiniKanren ve microKanren'in standart uygulamaları, tek bir istisna dışında hiçbir mutasyon veya başka yan etkiler içermez: miniKanren'in bazı sürümleri mantık değişkenlerinin karşılaştırılması için işaretçi eşitliğini kullanır. Bunu "iyi huylu bir etki" olarak görüyorum, ancak birçok uygulama bu etkiyi bile uygulamadan bir sayaç geçirerek engelliyor. Ayrıca küresel bir bilgi veri tabanı da yoktur. miniKanren'in uygulama felsefesi, işlevsel programlamadan esinlenmiştir: mutasyon ve etkilerden kaçınılmalıdır ve tüm dil yapıları sözlü kapsama saygı göstermelidir. Uygulamaya dikkatlice bakarsanız, birkaç monad bile görebilirsiniz. Arama uygulaması, bir kez daha mutasyon kullanmadan tembel akışları birleştirmeye ve manipüle etmeye dayanmaktadır. Bu uygulama seçenekleri, Prolog'dan çok farklı ödünleşmelere yol açar. Prolog'da değişken arama sabit bir zamandır, ancak geri izleme yan etkilerin geri alınmasını gerektirir. MiniKanren'de değişken araması daha pahalıdır, ancak geriye dönük izleme "ücretsizdir". Aslında miniKanren'de akışların nasıl işlendiğinden dolayı geri dönüş yoktur.
MiniKanren uygulamasının ilginç bir yönü, kodun doğası gereği iş parçacığı açısından güvenli ve - en azından teoride - önemsiz şekilde paralelleştirilebilir olmasıdır. Elbette, paralelleştirmenin ek yükünü telafi etmek için her bir iş parçacığına veya işleme yeterince iş verilmesi gerektiği göz önüne alındığında , kodu yavaşlatmadan paralel hale getirmek önemsiz değildir. Yine de bu miniKanren uygulamasının daha fazla ilgi ve deneyimler alacağını umduğum bir alan.
miniKanren, birleşme için tekrar kontrolünü kullanır ve önce derinlik araması yerine tam bir serpiştirme araması kullanır. Araya girerek arama derinlemesine aramadan daha fazla bellek kullanır, ancak bazı durumlarda ilk derinlemesine aramanın sonsuza kadar sapacağı / döneceği bazı durumlarda yanıtlar bulabilir. miniKanren yapar birkaç ekstra-mantıksal operatörler --- desteklemek conda
, condu
ve project
, için örnek. conda
ve condu
Prolog'un kesimini simüle etmek project
için kullanılabilir ve bir mantık değişkeniyle ilişkili değeri elde etmek için kullanılabilir.
Varlığı conda
, condu
veproject
--- ve arama stratejisini kolayca değiştirebilme yeteneği --- programcıların miniKanren'i gömülü Prolog benzeri bir dil olarak kullanmalarına olanak tanır. Bu, özellikle birçok Prolog benzeri uzantı içeren Clojure'un 'core.logic' kullanıcıları için geçerlidir. MiniKanren'in bu "pragmatik" kullanımı, miniKanren'in endüstrideki kullanımının çoğunu açıklıyor gibi görünüyor. Clojure veya Python veya JavaScript ile yazılmış mevcut bir uygulamaya bilgi tabanlı bir akıl yürütme sistemi eklemek isteyen programcılar, genellikle tüm uygulamalarını Prolog'da yeniden yazmakla ilgilenmezler. Clojure veya Python'da küçük bir mantık programlama dili yerleştirmek çok daha çekici. Gömülü bir Prolog uygulaması muhtemelen bu amaç için de işe yarayacaktır.
MiniKanren'in Prolog'a ruhsal olarak benzer pragmatik bir gömülü mantık programlama dili olarak kullanımına ek olarak, miniKanren "ilişkisel" programlamada araştırma için kullanılmaktadır. Yani matematiksel işlevler yerine matematiksel ilişkiler olarak davranan programlar yazarken. Örneğin, Şema içinde append
işlev iki liste ekleyebilir ve yeni bir liste döndürebilir: işlev çağrısı (append '(a b c) '(d e))
listeyi döndürür (a b c d e)
. Bununla birlikte, append
iki bağımsız değişkenli bir işlev yerine üç basamaklı bir ilişki olarak da ele alabiliriz . Çağrı (appendo '(a b c) '(d e) Z)
daha sonra mantık değişkenini Z
listeyle ilişkilendirir (a b c d e)
. Elbette mantık değişkenlerini başka konumlara yerleştirdiğimizde işler daha ilginç hale geliyor. Çağrı (appendo X '(d e) '(a b c d e))
ilişkilendirir X
ile (a b c)
görüşmesi sırasında,(appendo X Y '(a b c d e))
ilişkilendirilir X
ve Y
eklendiğinde eşit olan liste çiftleriyle (a b c d e)
. Örneğin X
= (a b)
ve Y
= (c d e)
böyle bir değer çiftidir. Biz de yazabilir (appendo X Y Z)
listelerin sonsuz sayıda üçe üretecek olan X
, Y
ve Z
bu tür ekleyerek bu X
kadar Y
üretir Z
.
Uygulamasının bu ilişkisel versiyonu append
Prolog'da kolaylıkla ifade edilebilir ve aslında birçok Prolog dersinde gösterilmektedir. Uygulamada, daha karmaşık Prolog programları, sonuçta ortaya çıkan programı bir ilişki olarak işleme yeteneğini engelleyen kesme gibi en azından birkaç ekstra mantıksal özelliği kullanma eğilimindedir. Buna karşılık, miniKanren bu tarz ilişkisel programlamayı desteklemek için açıkça tasarlanmıştır. MiniKanren daha yeni sürümleri (sembolik kısıt çözme için destek var symbolo
, numbero
,absento
, eşitsizlik kısıtlamaları, nominal mantık programlama) önemsiz olmayan programları ilişki olarak yazmayı kolaylaştırmak için. Pratikte miniKanren'in ekstra mantıksal özelliklerinden hiçbirini kullanmıyorum ve tüm miniKanren programlarımı ilişki olarak yazıyorum. En ilginç ilişkisel programlar, Scheme'nin bir alt kümesi için ilişkisel tercümanlardır. Bu tercümanlar, listeyi değerlendiren bir milyon Şema programı (I love you)
oluşturmak veya önemsiz bir şekilde quine (kendi kendilerine değerlendiren programlar) oluşturmak gibi birçok ilginç yeteneğe sahiptir .
miniKanren, Prolog'un yaptığı takaslardan çok farklı olan bu ilişkisel programlama tarzını etkinleştirmek için bir dizi değiş tokuş yapar. Zamanla miniKanren daha fazla sembolik kısıtlama ekledi ve gerçekten sembolik yönelimli bir Kısıtlama Mantığı Programlama dili haline geldi. Çoğu durumda, bu sembolik kısıtlamalar, condu
ve gibi ekstra mantıksal işleçleri kullanmaktan kaçınmayı pratik hale getirir project
. Diğer durumlarda, bu sembolik kısıtlamalar yeterli değildir. Sembolik kısıtlamalar için daha iyi destek, miniKanren araştırmalarının aktif alanlarından biri ve ilişkiler olarak daha büyük ve daha karmaşık programların nasıl yazılacağına dair daha geniş bir sorudur.
Kısacası hem miniKanren hem de Prolog'un ilginç özellikleri, uygulamaları ve kullanımları var ve bence her iki dilden de fikirleri öğrenmeye değer. Mercury, Curry ve Gödel gibi diğer çok ilginç mantık programlama dilleri de vardır ve bunların her biri kendi mantık programlamasına sahiptir.
Birkaç miniKanren kaynağıyla bitireceğim:
Ana miniKanren web sitesi:
http://minikanren.org/
İlişkisel programlama ve miniKanren üzerine Prolog ile bir karşılaştırma da dahil olmak üzere verdiğim bir röportaj:
http://www.infoq.com/interviews/byrd-relational-programming-minikanren
Alkış,
--Niyet