Prolog tercümanı tamamen işlevsel bir dilde nasıl uygulanır?


25

Prolog yorumlayıcıyı tamamen işlevsel bir dilde nasıl uygulayacağınıza dair sözde kodla açık bir referans var mı? Şimdiye dek bulduklarımın yalnızca zorunlu dillerle ilgilendiği görülüyor, yalnızca kendi başına uygulanan Prolog'un bir gösterimi veya yorumlama için kullanılacak somut bir algoritma sunmuyor. Bir cevabı çok takdir ediyorum.


4
Patrice Boizumault tarafından Prolog'un (Bilgisayar Biliminde Princeton Serisi) Uygulaması Lisp'te uygulanmaktadır.
Ness

Nispeten yeni bir yaklaşım için bu cevaba bakınız .
yanlış

Yanıtlar:


24

Prolog'dan beri = Sözdizimsel Birleşme + Geri zincirleme + REPL

Her üç bölüm de Yapay zekada bulunabilir: George F. Luger tarafından karmaşık problem çözme yapıları ve stratejileri . Her üç parça halinde uygulanmaktadır kitabın dördüncü baskısında LISP Bölüm 15.8 yılında, Mantık LISP'de Programlama. Ayrıca aynı kodu diğer kitaplarına da koyuyor, ancak hepsine burada kaydettiğim için elimde değil. Kitaplarının kodu burada bulunabilir .

Üç bölümün de bulunduğu bir başka kaynak , yapay zeka programlamasının paradigmalarında bulunabilir : Peter Norvig tarafından Common Lisp'te vaka çalışmaları . Bkz. Bölüm 11, Mantık Programlama ve 12, Mantık Programlarının Derlenmesi. Kitabının kodu burada bulunabilir .

Diğer bir kaynak ise bilgisayar programlarının Hal Abelson, Jerry Sussman ve Julie Sussman tarafından yorumlanması . Bkz. Bölüm 4.4 Mantık Programlama. Kitabın sitesi burada ve kitabın kodu burada .

Nereye bakacağınızı biliyorsanız, birçok uygulamada uygulanan geri zincirleme ile birleştirme algoritmasını bulmak nadir değildir; özellikle fonksiyonel derleyicilerde tip çıkarımında yaygındır. Anahtar kelimelerin birleştirilmesi veya meydana gelmesi anahtar kelimelerin kullanılmasına yardımcı olur. Ayrıca çoğu uygulama, birleştirme işlevinin adı için unif kullanır.

Prolog'un bir sürümü için, OCaml'de yapılan REPL'den az, "Pratik Mantık ve Otomatik Muhakeme El Kitabı" için Kod ve kaynaklar bölümüne bakın - prolog.ml

Kitap kodunun F # 'ya çevirisi burada bulunabilir . Kitap kodunun Haskell'e çevirisi burada bulunabilir .

Kod bulma açısından, birleştirme algoritmasının bulunması en kolay olanıdır, daha sonra uygulamalara gömülmüş arka zincirleme ile uygulamalar. Prolog'un tamamen işlevsel bir uygulamasını REPL ile işlevsel bir dilde bulmak en zorudur. Çoğu zaman kod, PROLOG içerisinde doğrudan kullanım için bir biçimde değildir; performansı artırmak için yoğun şekilde özelleştirilmiştir, bu nedenle kodu bulabilirsiniz, ancak istediğiniz parçaları çıkarmak için buna değmez. Tavsiyem Luger'in kitabını okumak ve LISP'i kurmak, öğrenmek ve tercüme etmek anlamına gelse bile, seçtiğiniz dilde sıfırdan oluşturmak olacaktır.

DÜZENLE

Bu StackOverflow gelen yinelenen bir soru olduğundan ve OP yeni ve yorumlarda şöyle diyor:

Daha fazla bağlam vermek için, tür çıkarımı uygulamaya çalışıyorum, ancak dilimin tür sistemindeki karmaşık özellikler (Bağımlı türler, ayrıntılandırma türleri, daha az yaygın olanları adlandırmak için doğrusal yazım) benim tür çıkarımı çok genel bir algoritma elde etmek için Prolog kullanan algoritmalara dayandırmak için faydalı olabilir. Tamamen kendi kendime öğrendiğimi not edeceğim, bu yüzden bilgim geniş alanlarda eksik.

Burada bunun üzerine genişleyeceğim, ancak OP'nin yeni bir soru sorması gerektiğini fark ettim.

Bazı girişler için, bkz . Tür çıkarımı .

Bu konuda bildiğim en iyi kitap Benjamin C. Pierce'in türleri ve programlama dilleri . Kitabın sitesi burada . OCaml koduna bağlantılar içeren kaynaklar burada . Ve son zamanlarda başladı ama çoğunlukla bunun F # 'ya tam çevirisi burada .

Bağımlı türler: sf. 462 Arıtma tipleri: sf. 207 Doğrusal mantık ve tip sistemleri: sf. 109


1
Guy Coder, siz baylar bir beyefendi ve bilginsiniz! Yardımınız çok faydalı ve bu soruyu cevaplamak için gerçekten zaman ayırdığınız için size yeterince teşekkür edemiyorum. = D - Jimster'in İşbirliği ve Araştırma
Yorucu

Tekrar teşekkür ederim, bu kitapları çoktan aldım (daha önce olduğu gibi, bir kitapçıya hızlı bir yolculukta olduğu gibi).
Jimster

@Jimster Norvig kodu güzel ve açık, bir sayfaya IIRC uyuyor. Saf olsa bile, hatırlamıyorum .
Ness

Başka bir tane buldum
Guy Coder


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.