Mantık programlama açısından Prolog ve miniKanren arasındaki temel teknik farklılıklar nelerdir? [kapalı]


124

Mantık programlamasını okumak istediğimde, bugünlerde bunu yapmanın iki "ana" yolunu hep buluyorum:

  • miniKanren , The Reasoned Schemer'da tanıtılan ve core.logic nedeniyle şu anda popüler olan bir minilanguage .
  • Prolog , ilk "büyük" mantık programlama dili.

Şimdi ilgilendiğim konu: İkisi arasındaki temel teknik farklar nelerdir? Yaklaşım ve uygulama açısından çok benzerler mi yoksa mantık programlamaya tamamen farklı yaklaşımlar mı benimsiyorlar? Matematiğin hangi dallarından geliyorlar ve teorik temelleri nelerdir?


3
Bu sorunun kapandığını görmek üzücü. Çok ikna edici cevap ve çok sayıda olumlu oyla gösterildiği gibi, bu oldukça faydalı bir sorudur.
Yeniden

@nealmcb bir zamanlar pek çok olumlu oyla konu üzerine olan sorular artık olmayabilir, olumlu oyların miktarı onu geçerli ya da değil tanımlayan şey değildir.
Tiago Martins Peres 李大仁

Yanıtlar:


281

Ö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 assertve retractprojeksiyonu dahil olmak üzere birçok "ekstra mantıksal" veya "mantıksız" özelliği desteklerisvb. 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, conduve project, için örnek. condave conduProlog'un kesimini simüle etmek projectiçin kullanılabilir ve bir mantık değişkeniyle ilişkili değeri elde etmek için kullanılabilir.

Varlığı conda, conduveproject--- 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 appendiş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, appendiki 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 Zlisteyle 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 Xile (a b c)görüşmesi sırasında,(appendo X Y '(a b c d e))ilişkilendirilir Xve Yeklendiğ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, Yve Zbu tür ekleyerek bu Xkadar Yüretir Z.

Uygulamasının bu ilişkisel versiyonu appendProlog'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, conduve 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


9
Şimdi uçup gidersem özür dilerim. Mantık ve kısıt tabanlı programlamada ilk düşünce deneylerine yeni başladım ve aldığım cevap bu. :) Aslında cevabınızda da belirttiğiniz gibi, güçlü bir şüphe duydum mantık hesaplaması Monad olarak uygulamaya mükemmel bir adaydı; daha çok bir MonadPlus olduğu ortaya çıktı ve gerçekten de meslektaşınız Friedman tarafından hazırlanmış bir makale ve referans uygulaması var ! Yani şimdi onu okuyorum ve onunla oynuyorum, bunun hakkında herhangi bir fikrin var mı?
Profpatsch

4
MicroKanren makalesini ve kodunu da ilginç bulacağınızdan şüpheleniyorum: webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf ve github.com/jasonhemann/microKanren
William E. Byrd

5
Ayrıca, Pazar günleri Doğu saatiyle 15: 00'da (GMT -5: 00) Google Hangouts'ta haftalık bir miniKanren ders çözme organize ediyorum. Bize katılmak isterseniz, @webyrd Twitter hesabımdan her zaman linke tweet atıyorum. Daha önce kaydedilmiş hangout'lar şu adreste yer almaktadır: youtube.com/playlist?list=PLO4TbomOdn2cks2n5PvifialL8kQwt0aW
William E. Byrd

2
Bence temelde '05 gazetesindeki arama monadının aynısı. Ayrıca, Seres ve Spivey'in
William E. Byrd

1
@ WilliamE.Byrd - Harika cevap! Bir tane olduğunu varsayarsak, bir C / C ++ programına yerleştirilebilecek en iyi miniKanren uygulaması nedir? Ayrıca miniKanren, Prolog'un üretken doğasına sahip mi? Yani, bir değişkeni topraklanmamış bir ifadede bırakma yeteneği ve çekirdek motor, program tarafından beyan edilen mevcut ilişkiler göz önüne alındığında topraklanmamış değişken için olası tüm değerleri üretecektir.
Robert Oschler

4

Geçici cevap:

AFAIK, "The Reasoned Schemer", Boole değerlerine "#u" (başarısız) ve "#s" (suceeed) sabit hedeflerini ekleyerek, bir Scheme-y sözdiziminde ve fonksiyonel programlama stilinde temel mantık programlamayı tanıttı "#t "ve" #f ". Mantık programlamaya Prolog ile aynı yaklaşımı kullandı: Birleştirme ve geriye dönük arama. Hafta sonu boyunca o kitabı rafımdan almak için biraz zamanım olup olmadığını göreceğim. Matematiğin dalı, sınırlı bir form birinci dereceden mantıktır, bu durumda Horn cümleleri ve Çözüm Unfication. Bakınız: Computational Logic: Memories of the Past and Challenges for the Future by John Alan Robinson ve Robert Kowalski tarafından soğuk bir başlangıç ​​için mantık programlamanın ilk yılları .


3
Bu iki alıntı Kanren veya MiniKanren ile ne ilgisi var?
yanlış

2
Son soruya bakın: "Matematiğin hangi dallarından geliyorlar ve teorik temeller nelerdir?"
Frank Shearar
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.