Kendi kaynak kodu hakkında program akıl yürütme


15

Bu sorunun ilham kaynağı şu (belirsiz) sorudur: AI'nın kendi kaynak kodu hakkında akıl yürütüp onu değiştirebilecek programlama dili / mantıksal temelleri nelerdir?

Bu çok titiz değil, işte burada somut bir soru çıkarmaya çalışıyorum. İlgilendiğim iki şey var:

(A) Kendi programlarını bir veri tipi Programı (örn., AST olarak) olarak temsil edebilen ve değiştirebilen bir programlama dili P. (İstenirse, Program türündeki bir nesne, o dilde geçerli bir programın metni olan bir Dize'ye dönüştürülebilir. Bu, bir derleyicinin yaptıklarının tersidir.)

(B) P dilinde bir programın ne yaptığını anlamaya yönelik bir yöntem. İşte düşündüğüm iki seviye:

  1. Bir P-programının ne yaptığını modelleyen bir başka dil Q (teorem kanıtlama yetenekleri ile). "Program p'nin çalıştırılmasının sonucu foo" gibi ifadeleri ifade edebilmeli ve kanıtlayabilmelidir.
  2. Bir programın p: Programın P dilinde ne yaptığını anlamanın bir yolu . (Yani yukarıda P = Q alıyoruz.)

Böyle bir şey ne dereceye kadar uygulandı veya bu yönde ilerleme nedir? Pratik engeller nelerdir? Sorunun asıl amacı ışığında, sorunu resmileştirmenin en iyi yolu nedir?

*

Cevapların gösterdiği gibi (teşekkürler!), Hem (A) hem de (B1) ayrı ayrı yapılabilir, ancak bunları birlikte yapmak daha çok bir araştırma sorusudur.

İşte soru hakkındaki ilk düşüncelerimden bazıları (uyarı: oldukça belirsiz). Martin Berger'in cevabı hakkındaki yorumlarıma da bakınız.

Ben daha basit bir dil yerine , aynı programlama dili modelleme programlama dili ile ilgileniyorum (yani P = Q yukarıda). Bu, bir programın "kendi kaynak kodu hakkında akıl yürütme" yeteneğinin "kavram kanıtı" olacaktır. Bağımlı olarak yazılan programlama dilleri, işlevlerinin çıktıları hakkında garanti verebilir, ancak bu, "kendi kaynak kodu hakkında akıl yürütme" olarak "Merhaba dünya!" otomatik olarak çıplak bir dize basacak bir dilde bir quine olarak sayılır --- bir tür alıntı / öz referans olması gerekir. Buradaki analog, Programı temsil eden bir veri tipine sahip.

Oldukça büyük bir proje gibi görünüyor - dil ne kadar basitse, içindeki her şeyi ifade etmek o kadar zor; dil ne kadar karmaşıksa, dili modellemek için o kadar fazla çalışma yapılması gerekir.

Özyineleme Teoreminin ruhuna göre, bir program daha sonra kendi kaynak kodunu "alabilir" ve değiştirebilir (yani, kendisinin değiştirilmiş bir versiyonunu çıkarabilir). (B2) daha sonra, programın değiştirilmiş program hakkında bir garanti ifade edebilmesi gerektiğini söyler (bu, tekrar okuyabilmelidir, yani gelecekteki tüm değişiklikler hakkında bir şeyler ifade edebilmelidir-?).


1
"Program p'yi çalıştırmanın sonucunun foo" olduğunu belirlemek için neden bir teorem kanıtlayıcı olarak hareket etmek için dile ihtiyacınız var? Dil sadece p çalıştırabilir! Gerçekten de olan budur.
Martin Berger


3
Prensipte, kendileri için bir tercüman uygulayabilen tüm dillerin ihtiyaç duyduğunuz şeyleri yapabileceğini unutmayın. Daha matematiksel olarak, özyineleme teoremi herhangi bir güçlü hesaplama modeli için geçerlidir. Bazı programlama dilleri yerleşik hale getirerek bunu kolaylaştırır. Muhakeme için de aynıdır: bu diller içine herhangi bir muhakeme sistemi uygulayabilirsiniz. Tabii ki her şeyin mantıklı gelmesi beklenemez, örneğin programların durdurulması sorunu.
Kaveh

2
Bence soru çok açık değil. Cevabında Python, Java ve Martin tarafından bahsedilen programlama dillerine bir göz atmalı ve soruyu netleştirmeli, böylece ya aradığınızı karşıladıkları ya da neden olmasa da açık olmalıdır.
Kaveh

1
@HoldenLee "P = Q" ile ilgili olarak, oluşturulan terminoloji, "homojen meta-programlama" dır, buradaki P Q.
Martin Berger

Yanıtlar:


14

Bence iki farklı şey soruyorsun.

  • Bir programlama dilinin tüm programlarını veri olarak temsil etme yeteneği.
  • Veri olarak programlar hakkında akıl yürütme.

Analitik amaçlar için, onları ayrı tutmak yararlıdır. İlkine odaklanacağım.

Bir programlama dillerinin, meta-programlama veya homoikoniklik gibi terimler altında veri olarak programlarını temsil etme, kullanma (ve çalıştırma) yeteneği .

(Garip) bir şekilde, iyi bilinen tüm programlama dilleri, dize veri türünü, dizelerde harici programları (derleyici, bağlayıcı vb.) Çağırma (ör. Dosyaya yazarak) yeteneği ile birlikte meta-programlama yapabilir. sistem ilk). Ancak, muhtemelen bunu kastetmiyorsunuz. Muhtemelen aklınızda güzel bir sözdiziminiz var. Dizeler, program gösterimi için hoş bir sözdizimi değildir, çünkü neredeyse tüm dizeler programları temsil etmez, yani dize veri türü, bir program temsil mekanizması olarak göründüğünde çok fazla 'gereksiz' içerir. Daha da kötüsü, dizi işlemlerinin cebirinin aslında program yapımının cebiri ile hiçbir bağlantısı yoktur.

Muhtemelen aklınızda olan şey çok daha hoş bir şeydir. Örneğin eğer , bir programı ve sonra P olan P , ama veri olarak, manipülasyon ve analiz için eldeki. Buna genellikle tırnak denir . Pratikte, teklif esnek değildir, bu nedenle , bunun yerine yarı-tırnak kullanırız; bu, teklifin, delikleri 'doldurmak' için veri sağlayan programların çalıştırılabileceği 'deliklere sahip olabileceği bir teklifin genelleştirilmesidir. Örneğin i fPPP bir koşullu temsil eden bir yarı-alıntı yerine bir deliğe sahip bir durumdur [ ] . Program Eğer M verilerine değerlendirirx > 0 , daha sonra yarı-alıntıı f

benf[]then7else8+9
[]Mx>0 verilerine değerlendiriri f
benf[M]then7else8+9
benfx>0then7else8+9.

( tırnak içine alınmış bir program, yani veri olarak program döndüren normal bir program (veri olarak bir program değil) olduğunu unutmayın.) Bunun çalışması için programları temsil edecek bir veri türüne ihtiyacınız vardır. Genellikle bu veri türüne AST (soyut sözdizimi ağacı) denir ve (yarı-) tırnakları AST'ler için kısaltma mekanizmaları olarak görebilirsiniz.M

Birçok programlama dili yarı-tırnak ve meta-programlama için diğer özellikler sunar. Programlamalara veri muamelesi yapma yeteneğine öncülük eden makrolama işlevselliği ile Lisp'di. Belki de ne yazık ki, Lisp tabanlı makroların gücünün uzun zamandır Lisp'in minimalist sözdizimine dayandığı görülüyordu; MetaML (1) 'e kadar modern, sözdizimsel açıdan zengin bir dilin meta programlama yapabildiği gösterilmemiştir. O zamandan beri, MetaOCaml (2) (MetaML'nin torunu, programların veri olarak nasıl yazılacağı sorununu çözmek için hala devam eden arayışındaki atılımı için önemli), Şablon Haskell (3) ve Converge (4) ( bence tüm önemli meta-programlama özellikleri) çeşitli modern programlama dillerinin meta-programlama barındırabileceğini göstermiştir. Alabiliriz kiherhangi bir programlama dili meta-programlama dili çevirmek ve L m p olan L veri olarak kendi programlarını temsil eden (ve değerlendirilmesi) yeteneği ile birlikte.LLmpL

evbirl()PPPPevbirl(P)meta-programlanmış programlar değerlendiriliyor (derleme zamanı ve çalışma zamanı meta-programlı ayrımı doğuruyor), tiplerle veya başarısız değerlendirmelerle ne yapmalı, den gitme sürecinde bağlı ve serbest değişkenlere ne olur? P veya tam tersine.PP

İkinci boyuta gelince, veri olarak verilen programlar hakkında akıl yürütme. Programları verilere dönüştürebildiğiniz anda, bunlar 'normal' veridir ve veri olarak düşünülebilir. Joshua'nın belirttiği gibi, her tür kanıtlayıcı teknolojiyi kullanabilirsiniz, örneğin bağımlı türler veya sözleşmeler veya etkileşimli teorem provatörleri veya otomatik araçlar. Ancak, akıl yürütme sürecinde dilinizin anlambilimini temsil etmeniz gerekecektir. Eğer bu dil, ihtiyaç duyduğunuzda, meta programlama yeteneklerine sahipse, işler biraz zor olabilir ve bu yönde çok fazla çalışma yapılmamıştır, (5) bu amaç için tek program mantığıdır. Meta-programlama ile ilgili akıl yürütme üzerine Curry-Howard merkezli çalışmalar da vardır (6, 7, 8). Bu mantık temelli yaklaşımların, ve tipe dayalı yaklaşım (2) gerçekten de gelecekteki tüm meta programlama aşamaları için geçerli olan özellikleri ifade edebilir. (2) dışında bu belgelerin hiçbiri uygulanmamıştır.

Özetle: İstediğiniz şey uygulandı, ancak oldukça ince ve özellikle türler ve akılcı akıl yürütme ile ilgili hala açık sorular var.


  1. W. Taha. Çok Aşamalı Programlama: Teorisi ve Uygulamaları .

  2. W. Taha ve MF Nielsen. Çevre sınıflandırıcılar .

  3. T. Sheard ve S. Peyton Jones. Haskell için şablon meta-programlama .

  4. L. Tratt. Dinamik yazılan OO dilinde derleme zamanı meta programlama .

  5. M. Berger, L. Tratt, Homojen Meta Programlama için Program Mantığı .

  6. R. Davies, F. Pfenning, Aşamalı hesaplamanın modsal bir analizi .

  7. R. Davies, Bağlanma Zamanı Analizine Geçici-Mantıksal Bir Yaklaşım .

  8. T. Tsukada, A. Igarashi. Çevre sınıflandırıcıları için mantıklı bir temel .


Haklısınız - programlama dili P, o dildeki programlar hakkında teoremleri / kanıtları ifade eden Q dilinden farklı olabilir (örneğin Coq'ta olabilir). Düşündüğüm teorem şu şekildedir: Diyelim ki dikkatle tasarlanmış bir programımız var A_1. Thm: Aşağıdakilerin her biri için aşağıdakiler geçerlidir: A_n programı çıktı verir (m_n, A_ {n + 1}), burada m_n bir tamsayıdır, A_ {n + 1} başka bir programdır (örneğin, A_n bir şekilde değiştirilerek elde edilir) ve tüm n için m_n> 0 değerine sahibiz.
Holden Lee

(Bunun bilim kurgu versiyonu, kendini değiştirmeye devam eden bir programın, nükleer bir füze başlatan düğmeye asla basmayacağını veya programın her zaman belirli bir miktarı optimize edeceğini "kanıtladığımızdır."
Holden Lee

Bu yüzden programı çalıştırmak ve programın çıktılarını akıl yürütmek arasında bir ayrım yapmak istedim - çalıştırılmadan önce ne yapacağının özelliklerini bilmek istiyoruz. A_n'nin A_ {n + 1} üretmek için "kaynak kodunu değiştirebilmesini" istiyorsak, P'nin zorunlu olarak meta programlama yeteneklerine sahip olacağını unutmayın (bu bizi (5) konumuna getirir).
Holden Lee

Bana öyle geliyor ki P = Q için ilginç olacak. Varsayımsal olarak, A bir AI programıdır ve kendini değiştirmenin yolu kendi kodunu düşünmektir - örneğin, kod parçaları hakkında teoremleri yazmak, kanıtlamak ve ancak kodunu değiştirmek. Öyleyse P, Q'nun yeteneklerine sahip olmalı
Holden Lee

@HoldenLee A_n gibi programlar yazmak mümkündür. Dizeleri programların temsili olarak kullanırsanız, bu herhangi bir dilde önemsiz bir şekilde yapılabilir, yarı tırnak veya benzeri bir şey istiyorsanız, bu örneğin Converge'de mümkündür. M_n'nin inşaattaki rolünü anlamıyorum.
Martin Berger

6

Hayır, sisteminizdeki dört adımı da gerçekleştiren geçerli bir sistem yoktur. Bir sistem tasarlamak istiyorsanız ilk şartlardan biri homoikonik dildir. En azından, mümkün olduğunca küçük olan temel programlama dilinizin olmasını istersiniz, böylece sisteme girip kendini yorumlamaya başladığınızda çalışır. Bu yüzden lisp'de öncülük eden metakirküler bir tercüman istiyorsunuz. Diğer diller de bunu yaptı, ancak lisp üzerinde çok fazla mevcut araştırma var.

Bunu yapmak istiyorsanız ilk adım Lisp veya çalışan bir program hakkında akıl yürütebileceğiniz bir çerçeve gibi homoik bir dile sahip olmaktır. Lisp, bunun için, dilde bir metakirküler tercüman tanımlayabilmeniz veya kodunuzu veri olarak değerlendirebilmeniz için kullanılır. Kodu veri olarak ele almak en önemli şeydir. C2 wiki'de homoikonik ne anlama geldiğiyle ilgili tartışmalar var.

Örneğin Lisp'de "Program" veri türünüz geçerli lisp programlarıdır. Lisp programlarını bir tercümana iletirsiniz ve bir şey hesaplar. Geçerli bir "Program" programlamazsanız tercüman tarafından reddedilir.

Bu nedenle, homoikonik bir dil gereksinimlerinizi yerine getirir. Lisp'de bile resmi bir program fikrini tanımlayabilirsiniz.

Lisp'i lisp içinde modelleyebilir misiniz? Evet, bu genellikle yeteneklerinizi test etmek için bir lisp programlama kitabının sonunda bir alıştırma olarak yapılır. SICP

Şu anki sayı dördü bir araştırma sorusu ve aşağıda bu soruyu cevaplamaya çalışan bulduk.

Bunu yapmaya çalışan birçok program türü olduğunu söyleyebilirim. Aşağıda bildiğim tüm programlar var.

  • JSLint , makine kodunu veya başka bir dili alan ve hataları açıkça arayan statik analizörlere bir örnektir. Sonra bir programcıdan bunu düzeltmesini ister.

  • Coq , bir programlama dili kullanarak provaları belirtmenize izin veren bir ortamdır. Ayrıca, sorunu çözmenin yollarını önerdiği taktiklere sahiptir. Yine de bu, bir insanın işi yapmasını bekler. Coq çalışmak için bağımlı türleri kullanır ve bu nedenle çok tip teoriktir. Bilgisayar bilimcileri ve Homotopy Type Theory üzerinde çalışan insanlar arasında çok popüler.

  • ACL2 Öte yandan otomatik bir teoremi prover olduğunu. Bu sistem, programladığınız bir şeye dayalı olarak ifadeleri kanıtlayacaktır.

  • ACL2 ve Coq, sistemlerini bir makine öğrenme sistemiyle arayüzleyen bir yazılım eklentisine sahiptir . Bu sistemleri eğitmek için kullanılanlar önceden yazılmış programlardır. Anladığım kadarıyla, bu sistemler sadece taktiklerinize değil, kanıt geliştirmeye yardımcı olan teoremlere sahip olduğunuz başka bir özellik daha ekliyor.

Aşağıda, sorunuzun ne anlama geldiğinin temelini bulacaksınız.

  • gcc kendisini girdi olarak alıp optimize edilmiş bir versiyonunu çıkarabilen bir optimizng derleyicisinin bir örneğidir. Programları bir gösterimden diğerine çeviren ve bazı optimizasyon işaretlerinden dolayı hızı artıran bir derleyici fikri çok iyi anlaşılmıştır. Derleyiciyi önyükledikten ve geçerli makine kodu oluşturduktan sonra, bir optimizasyon ekleyebilir ve derleyiciyi yeniden derleyebilirsiniz ve kendisinin daha verimli bir sürümünü yapar.

1
Dili mümkün olduğunca asgariye indirmeye gerek yoktur. İlgili meta programlama özelliklerini herhangi bir dile ekleyebilirsiniz. Taha'nın MetaML çalışması bunu gösterdi. Aslında meta-programlama yeteneklerinin eklenmesi mekaniktir.
Martin Berger

1
Aynı zamanda “dört adımı da uygulayan mevcut bir sistem yok” fikrine katılmıyorum. Soru 4 sadece kod olarak verilen programları çalıştırır. Bu tamamen mümkündür, aslında Javascript'in değerlendirmesi bile bunu yapar.
Martin Berger

@MartinBerger demek istediğim çekirdek çekirdeği olabildiğince asgariye indirmeniz. Ayrıca, sisteminizin # 4 yapacağını ummaya başlarsanız, sadece insanları değil, bilgisayarları da kullanabileceğiniz bir sistem isteyeceksiniz, böylece minimum bir sisteme sahip olmanız ve kodlanmış kütüphaneleri olması meta programlama şablonu gibi bir sistem
Joshua Herman

Ne hakkında konuştuğumuza bağlıdır (4). Orijinal soru bunların iki detayını içerir. Birincisi önemsiz, sadece programı çalıştırın. İkincisi, yazım sistemi (2) cevabımda (5) olarak belirttiğim mantık tarafından ele alınabilir. Daha sonra MetaOCaml'de uygulanır. Ancak daha fazla araştırmanın kapsamı vardır: ne (2) ne de (5) keyfi meta-programlama formlarıyla başa çıkamaz ve (2) tarafından garanti edilen özellikler biraz zayıftır (sonuçta, tür çıkarımlı bir yazım sistemidir) .
Martin Berger

1
"Çekirdek çekirdeği olabildiğince asgari hale getiriyorsunuz": bu gerekli değildir. Herhangi bir dile tam meta programlama ekleyebilirsiniz.
Martin Berger

5

Gibi @ user217281728 cevabı denilen daha çıkarsama ve AI ile ilgili makinelerin bir tip vardır bahseder Gödel Makineleri

Gödel makinesi, Jürgen Schmidhuber tarafından icat edilen ve sorunları en iyi şekilde çözen, kendini geliştiren bir bilgisayar programıdır. Yeni kodun daha uygun bir strateji sağladığını kanıtlayabildiğinde kendi kodunu yeniden yazdığı özyinelemeli bir kendini geliştirme protokolü kullanır. Makine Jürgen Schmidhuber tarafından icat edildi, ancak adını matematik teorilerine ilham veren Kurt Gödel'den alıyor.

Jürgen Schmidhuber'in "Goedel Makineleri: Kendini Referans Eden Evrensel Sorun Çözücülerin Makul Optimal Kendini İyileştirmeler Yapması" konulu referansı , (2006) arXiv: cs / 0309048v5

Makinenin meta öğrenmeyi uygulamak için çalışma şeklinin iki aşaması vardır:

  1. Veriden öğrenme (1. seviye, öğren)
  2. Kaynak kodunu / algoritmasını değiştirmek / optimize etmek için öğrenilen verileri kullanma (seviye 2, öğrenmeyi öğrenin)

Makine kendi kaynağını değiştirdiği için kendi kendine referans niteliğindedir, yani kendi kendini değiştirme özelliğine sahiptir (ayrıca buraya bakın ).

Bu anlamda öğrenme algoritmasını titizlikle değiştirebilir (optimum kendi kendini modifikasyonları kanıtlar). Bu durumda formu alan kendi kendine referans ve kararsızlık ile ilgili sorunlar vardır:

..Sınırsız hesaplama kaynaklarına sahip bir Gödel makinesi, etkinliği kanıtlanamayan kişisel gelişmeleri görmezden gelmelidir.

Kendini değiştirme özelliğine sahip diğer diller (ve ilgili tercüman makineleri) örneğin LISP'dir .

LISP kodunda ve veriler birbiriyle değiştirilebilir veya AST kaynak kodu LISP programında veri olarak mevcuttur ve veri olarak değiştirilebilir. Öte yandan, bazı kaynak kodları için veri AST olarak görülebilir.

Güncelleme

Kendi kendine referans , kendi kendini yeniden üretme ve kendi kendine programlamayı birleştiren kendi kendine programlama makineleri (diğerleri arasında) gibi başka makineler de vardır .

Yukarıdakilerin ilginç bir yönü, öz-referansın hiç sorunlu olmaması , daha ziyade kendi kendini yeniden üretme / kendi kendini programlama otomatalarında gerekli bir unsurdur .

Daha fazla ayrıntı (ve daha fazla yayın) için JP Moulin, CR Biyolojileri 329 (2006) 'ya bakınız.

Öz

Yaşayan sistemler, öngörülemeyen çevreye uygun tepkiler verebilir. Bu tür bir öz-örgütlenme, bir öz-programlama makinesi gibi çalışır, yani kendini değiştirebilen bir oprganizasyon. Şimdiye kadar önerilen canlıların öz-örgütlenme modelleri, diferansiyel sistemlerin fonksiyon çözümleri veya otomatanın geçiş fonksiyonlarıdır. Bu işlevler sabittir ve bu nedenle bu modeller kuruluşlarını değiştiremez. Öte yandan, bilgisayar bilimi, uyarlanabilir canlı sistemlerin özelliklerine sahip bir çok model önermektedir, ancak tüm bu modeller, bir hedef ile sonuçlar ve programcıların ustaca parametre seçimleri arasındaki karşılaştırmaya bağlıdır, oysa programcının niyeti yoktur. ne de yaşam sistemlerinde seçim.mspMsp


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.