Durma sorununu önleyen bir dizi program var mı


21

Sadece durma probleminin başka bir açıklamasını okuyordum ve bana sonsuz dizileri içeren örnekler olarak verilen tüm sorunları düşündüm. Ama programlarımda asla sonsuz diziler kullanmam - çok uzun sürüyorlar. Gerçek dünyadaki tüm uygulamaların alt ve üst sınırları vardır. Gerçekler bile gerçek değildir - 32/64 bit vb. Olarak depolanan yaklaşımlardır.

Öyleyse soru şu, eğer durmaları halinde belirlenebilecek bir program alt grubu var mı? Çoğu program için yeterince iyi mi. Bir programın 'durabilitesini' belirleyebileceğim bir dizi dil kurgu yapabilir miyim. Bunun daha önce bir yerlerde çalışıldığından eminim, böylece herhangi bir işaretçi takdir edilebilir. Dil tamamlanmadı, ama yeterince iyi olan neredeyse turing tamamlandı gibi bir şey var mı?

Doğal olarak yeterince böyle bir yapı, döngüler sırasında özyinelemeyi ve sınırsızlığı dışlamak zorunda kalacaktı, ancak yeterince kolay olmayan bir program yazabilirim.

Örnek olarak standart girdiden okumak sınırlandırılmış olmak zorunda kalacaktı, ama bu yeterince kolay - Girdilerimi sorun alanına bağlı olarak 10.000.000 karakter vb. İle sınırlayacağım.

Tia

[Güncelleştirme]

Belki yorumları ve cevapları okuduktan sonra sorumu tekrar cevaplamalıyım.

Tüm girişlerin sınırlandığı belirli bir program için programın durup durmayacağını belirleyebilirsiniz. Öyleyse, dilin kısıtlamaları nelerdir ve girdi kümesinin sınırları nelerdir? Bu yapıların azami kümesi, durup durulabilecek bir dil belirler. Bu konuda yapılmış bir çalışma var mı?

[Güncelleme 2]

İşte cevabı, evet, geri 1967’de http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf

Durma probleminin en azından teorik olarak kesin durum sistemleri için çözülebildiği, 1967'de Minsky tarafından zaten tartışılmıştı: tekrarlayan model Bu yinelenen modelin süresi, makinenin dahili durum sayısını aşamaz ... ”

(ve sonlu turing makinelerine sadık kalırsanız, bir kehanet inşa edebilirsiniz)


13
"sonsuz diziler ... çok uzun sürüyor". Beni yüksek sesle güldürdüm.
Bryan Oakley

3
SQL92 ve Normal İfadelerin durma garantisi verilen dillerin örnekleri olduğuna inanıyorum.
Elian Ebbing

2
Lütfen cevap olarak "Update2 ..." yazınız.
S.Lott

2
Özyinelemeyi hariç tutmanıza gerek yoktur. Özyinelemeyi, callee argümanlarının katı alt terimleriyle sınırlandırırsanız, sonlandırmayı her zaman kanıtlayabilirsiniz. Bu yeterli bir gerekliliktir - Kilise rakamlarını kullandığınız sürece "sınırlı döngüler" ve benzerleri gerekli değildir.
SK-mantığı

1
Idris dili, programlarınızı çalıştırmadan önce sonlandırdığını ispatlamak için bağımlı yazmayı ve kanıt denetleyiciyi kullanır. Haskell'e benzer ve özyinelemeye izin verir, ancak genel özyinelemeye değil - yalnızca (bağımlı türler yoluyla) bazı terminal durumuna yol açabileceğini ispat edebileceği özyineleme.
Jack,

Yanıtlar:


8

Sorun girişte değil (belli ki sınırsız girişle, sadece girişi okumak için sınırsız çalışma süresine sahip olabilirsiniz), iç durumların sayısındadır.

İç devlet sayısı sınırlandığında, teorik olarak durma problemini her durumda çözebilirsiniz (durdurulana veya bir devletin tekrarlanmasına kadar taklit edin), olmadığında, çözülemeyen durumlar var. . Ancak, iç devletlerin sayısı uygulamada sınırlanmış olsa bile, o kadar büyüktür ki, iç devletlerin sayısının sınırlılığına dayanan yöntemlerin, en önemsiz programların sona ermesini kanıtlamakta yararsızdır.

Programların sonlandırılmasını kontrol etmenin daha pratik yolları vardır. Örneğin, özyineleme ya da geçiş yapmayan ve döngü yapılarının tümü döngünün girişinde belirtilmesi gereken yineleme sayısına bağlı olan bir programlama dilinde ifade edin. (Sınırın, etkili sayıda yinelemeyle gerçekten ilgili olmaması gerektiğine dikkat edin, bir döngünün sonlandırıldığını ispatlamanın standart bir yolu, yinelemeden bir yinelemeden diğerine ve giriş koşulunuzu kesinlikle düşürdüğünüzü ispatlayan bir işleve sahip olmaktır. Olumlu olduğundan emin olun, ilk değerlendirmeyi sınırınız olarak koyabilirsiniz).


10

Öncelikle, durma dedektörümüz olsaydı ne olacağını düşünün. Çapraz argümandan, durma dedektörünün durmamasına veya yanlış cevap vermesine neden olacak en az bir programın olduğunu biliyoruz. Ama bu tuhaf ve olası bir program.

Bir durdurma dedektörünün imkansız olmasına rağmen başka bir argüman daha vardır ve bu, durdurma dedektörünün sihirli olacağı konusunda daha sezgisel bir argümandır. Fermat'ın Son Teoreminin doğru mu yanlış mı olduğunu bilmek istediğinizi varsayalım. Doğru ise durması ve yanlış olması durumunda sonsuza dek sürmesi için bir program yazmanız ve ardından durma dedektörünü çalıştırmanız yeterlidir. Sen yok programını çalıştırmak , sadece durdurulması dedektör çalıştırmak programı . Durma dedektörü sayısız teoride sayısız açık problemi sadece programlar yazarak derhal çözmemizi sağlayacaktır.

Peki, durması her zaman belirlenebilen programlar üretmek için garanti edilen bir programlama dili yazabilir misiniz? Emin. Sadece döngülere, koşullara sahip olamaz ve keyfi olarak fazla depolama alanı kullanamaz. Döngüsüz ya da "if" ifadeleri ya da kesinlikle sınırlı miktarda depolama alanı olmadan yaşamak istiyorsanız, kesin olarak, durması her zaman belirlenebilir bir dil yazabilirsiniz.


2
Atlama her zaman ileri, bir daha asla geri alınmayacaksa if ifadesi olabilir. Kısıtlanmış bir BASIC dili alt kümesi düşünüyorum; burada "GOTO X", currentLine + X satır numarasına gider ve X, 0'dan büyük olmalıdır. Satır geçersizse durdurun. Bu, depolama taleplerini artıracak, ancak önemsiz bazı mantıklara izin verecektir. Bu muhtemelen, tepe noktalarının bir grafik oluşturduğu ve bu grafiğin herhangi bir devrine sahip olamayacağı veya FSM'nin geçersiz olduğu sonlu bir durum makinesine eşdeğerdir. Ayrıca, çıkmaz olan herhangi bir devlet, kabul eden bir devlet olmalıdır.
Meslek

3
sınırlanmış döngüler olabilirdi - örneğin i = 1 ila 10 için, aynı şekilde iyi davranışlı yineleyiciler. Öyleyse çözülebilecek bir sonlu problemler sınıfı var mı - fermats teoremi, yine de gerçeklerin sonsuz dizisinde yer alıyor. Ancak, alanı 1 000 000'den küçük sayılarla sınırlarsak, durur.
daven11

2
Neden şart değil? Öyle görünüyor ki, atlamalar olmadan koşulların her zaman durduğu gösteriliyor ...
Billy ONeal

2
@nikie: Elbette zayıf bir argümandır. Mesele şu ki, böyle bir durdurma detektörünün , kanıtı bulmadan bu açıklamaları ispatlayabileceği veya ispat edemeyeceğidir . Okuyucuyu burada geliştirmeyi düşündüğüm sezgi, önemsiz bir durma algılayıcısının yazılabileceği bir dilin, Fermat'ın Son Teoremi veya Goldbach'ın Konjürasyonu gibi sayı teorisindeki basit problemleri bile temsil edemeyen bir dil olduğu ve bu nedenle de muhtemelen olmadığıdır. çok kullanışlı bir dil.
Eric Lippert 19:11

3
@EricLippert: Yanlış. Böyle bir dilde döngüler, uygun depolama ve diğer birçok yararlı şeyler olacaktır. Neredeyse her şeyi kodlamak mümkündür . Bakın, işte burada: coq.inria.fr
SK-mantık

6

Gödel, Escher, Bach'ı okumanı tavsiye ederim . Gödel'in eksiklik teoremine ve durma problemine değinen, çok eğlenceli ve aydınlatıcı bir kitap.

Özetle sorunuzu cevaplamak için: programınız bir whiledöngü (veya olası birçok tezahüründen herhangi birini) içermediği sürece durma problemi çözülebilir .


Üzgünüm, sizi yanlış okudum. Yorumumu sildim, ancak GEB'nin önerisini tekrar sunacağım.
AProgrammer

@zvrba Bir süredir okuma listemdeydi - muhtemelen dalma zamanı.
daven11

5

Sınırlı miktarda bellek üzerinde çalışan her türlü program için (her türlü depolama alanı dahil) durma sorunu çözülebilir; yani kaçınılmaz bir program koşuya gittikçe daha fazla bellek almak zorunda.

Ancak bu durumda bile, bu içgörü, gerçek dünya problemleri için kullanılabileceği anlamına gelmez, çünkü sadece birkaç kilobayt hafıza üzerinde çalışan bir durdurma programı, evrenin kalan ömründen daha uzun süre durdurabilir.


3

(Kısmen) sorunuzu yanıtlamak için "Durma sorununu önleyen programların bir alt kümesi var mı": evet, aslında var. Ancak, bu alt küme şaşırtıcı derecede kullanışsızdır (bahsettiğim alt kümenin durdurulan programların kesin bir alt kümesi olduğunu unutmayın).

“Girdilerin çoğu” için sorunların karmaşıklığının araştırılmasına genel durum karmaşıklığı denir . Olası girişlerin bazı alt kümelerini tanımlar, bu alt kümenin 'çoğu girişi' kapsadığını kanıtlar ve bu alt küme için sorunu çözen bir algoritma verirsiniz.

Örneğin, durma sorunu çoğu girdi için polinom zamanında çözülebilir (aslında, kağıdı doğru anlarsam doğrusal zamanda ).

Ancak, bu sonuç üç yan not nedeniyle oldukça işe yaramaz: birincisi, gerçek dünya bilgisayarlarındaki gerçek dünya bilgisayar programlarından ziyade tek bir bantla Turing makineleri hakkında konuşuyoruz. Bildiğim kadarıyla, hiç kimse aynı şeyin gerçek dünyadaki bilgisayarlar için geçerli olup olmadığını bilmiyor (gerçek dünyadaki bilgisayarlar Turing makineleriyle aynı işlevleri hesaplayabilseler de, izin verilen programların sayısı, uzunlukları ve durup durmamaları. tamamen farklı).

İkincisi, “çoğu girdi” nin ne anlama geldiğine dikkat etmeniz gerekir. Bu, 'uzunluk' n 'un rastgele bir programının bu algoritma ile kontrol edilebilme olasılığının, n'in sonsuzluğa eğiliminde olduğu gibi 1'e eğiliminde olduğu anlamına gelir. Başka bir deyişle, eğer n yeterince büyükse, o zaman n rastgele bir uzunluktaki program bu algoritma ile kontrol edilebilir.

Makalede açıklanan yaklaşımla hangi programlar kontrol edilebilir? Temel olarak, bir durumu tekrar etmeden önce durduran tüm programlar ('devlet' kabaca bir programdaki bir kod satırına karşılık gelir).

Neredeyse tüm programlar bu şekilde kontrol edilebilse de, bu şekilde kontrol edilebilecek programların hiçbiri çok ilginç değildir ve genellikle insanlar tarafından tasarlanmayacaktır, bu yüzden hiçbir şekilde pratik bir değeri yoktur.

Ayrıca, genel durum karmaşıklığının muhtemelen durma probleminde bize yardımcı olamayacağını, neredeyse tüm ilginç programların (görünüşe göre) kontrol edilmesi zor olduğunu gösteriyor. Veya, alternatif olarak ifade edilenler: neredeyse tüm programlar ilgi çekici değildir ancak kontrol edilmesi kolaydır.


2
-1, Bu pek çok düzeyde yanlış ...
user281377

1
İlk olarak, gerçek dünyadaki bilgisayarlar bir Turing makinesinin yapamayacağı hiçbir şeyi hesaplayamaz. Şimdiye kadar, hiç kimse bir Turing makinesinden daha yetenekli (hesaplanabilirlik açısından) gerçek dünyaya ait bir bilgisayar göstermedi. İkincisi, bir program durumunu tekrarlarsa durmaz, bu nedenle durma sorunu o program ve girdi için çözülür. Unutmayın: Durma problemi, bir programın verilen girdi üzerinde durup durmayacağına karar vermekle ilgilidir. Pozitif olarak tespit ettiğinizde sonsuz bir döngü tamamdır. Son olarak: Durdurma probleminin çözülebildiği çok sayıda faydalı program vardır: Sınırlı depolamada çalışanlar.
user281377

İlk sayınızla ilgili olarak: makalede belirtildiği gibi, bir hesaplama modelinin Turing'in tamam olduğunu gösterdiğini göstermek kaç tane programın tamamen durduğunu korumaz; Turing'in eksiksiz olduğunu çok iyi biliyorum ve neden cevabımı 'yanlış' yaptığına emin değilim.
Alex ten Brink,

İkinci sayınıza gelince: Bahsettiğim devletler, genellikle bahseden “makinenin durumu” ile aynı değildir (bu durum devlete sahip olabilecek her şeyin durumunu içerir), aksine sonlu durum otomatiğidir. Turing makinesini kontrol etmek için kullanılır, kabaca bir programın yürütme sırasında herhangi bir noktada üzerinde çalıştığı kod satırına karşılık gelir. Bir kod satırını tekrarlarken, hafızanızın içeriği farklı olabilir, bu nedenle bu hemen hemen durma anlamına gelmez. Bunu daha net hale getirmek için cevabımı güncelleyeceğim.
Alex ten Brink,

@ammoQ: Hayır, sınırlı depolama alanı olan gerçek dünya sistemleri hakkında konuşuyorsanız, durma sorunu çözülemez, çünkü bu durum devletlerin kombinasyonlarını idare edebilen gerçek dünya sistemi oluşturmak anlamına gelir. Çoğu CPU'daki olası kayıt durumlarının sayısı, Evrendeki atomların sayısını aştığı için, bunu yapamazsınız.
David Thornley

3

Gerçek hayatta, diğer problemler için durma problemini her zaman çözen programlar var. Bunlar, bilgisayarınızı çalıştırdığınız işletim sisteminin bir parçasıdır. Kararsızlık sadece TÜM diğer programlar için çalışan böyle bir program olmadığını söyleyen garip bir iddiadır.

Bir kişi doğru şekilde durma ispatının çözülemeyeceği tek program gibi göründüğünü ve sonsuz bir şekilde aynen kendini izlemekte olduğunu belirtti. Aynı kişi, eğer bir durdurma makinesi olsaydı, sihir olacağını söylerdi, çünkü çözücünün algoritmasının durup durmayacağını bize önceden söyleyerek bize zor matematik problemleri söyleyeceğini söyledi.

Her iki durumda da varsayım, durdurma makinesinin izlememesidir, çünkü iz sürdüğüne dair bir kanıt yoktur. Ancak, gerçekte gerçekte, verilen girdiyle çalıştırılan programı izler / çalıştırır.

Mantıklı kanıt en azından basittir. En azından ilk adımı izlemesi gerekmiyorsa, üzerinde çalıştığı programla birlikte girdi gerekmez. Bilgiden herhangi bir şekilde faydalanmak için, en azından o yolun nereye gittiğini analiz etmeye çalışmadan önce ilk adımı izlemek zorundadır.

En iyi cevapta belirtilen zor matematik problemleri, cevabı bulmak için hızlıca ileri gidemeyeceğiniz problemlerdir; bu, durma probleminin, bazı modeller tanınana kadar izlemeye devam etmesi gerektiği anlamına gelir.

Bu yüzden durma probleminden kurtulmanın tek pratik argümanı, durma makinesinin optimize edilmiş bir problem çözücünün sonucunu problem çözücünün bitirebileceğinden daha hızlı belirleyememesidir.

Bu akıl yürütme için resmi bir kanıt vermek daha zordur ve inanabildiğim halde, bunu bir akademiye herkese açıklamaya çalışmak, öfke gibi bir maymun atmalarına ve avizeden sallanmalarına neden olur. En iyisi bu insanlarla tartışmamak.


1

İşte cevabı, evet, geri 1967’de http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf

Durma probleminin en azından teorik olarak kesin durum sistemleri için çözülebildiği, 1967'de Minsky tarafından zaten tartışılmıştı: tekrarlayan model Bu yinelenen modelin süresi, makinenin dahili durum sayısını aşamaz ... ”

(ve sonlu turing makinelerine sadık kalırsanız, bir kehanet inşa edebilirsiniz)

Elbette bu ne kadar sürecek başka bir soru


0

Durdurulursa belirlenebilecek bir program alt grubu var mı?

Evet.

Çoğu program için yeterli mi?

"En" i tanımlayın.

Bir programın 'kesilebilirliğini' belirleyebileceğim bir dil yapıları oluşturabilir miyim?

Evet.

Yeterince iyi olan neredeyse turing tamamlandı diye bir şey var mı?

"Neredeyse" tanımlayın.

Birçok kişi Python'u whileifade veya özyineleme kullanmadan yazar.

Pek çok kişi Java'yı yalnızca basit yineleyiciler veya sonlandırdığı kesin olarak kanıtlanmış sayıcılar olan forifadeyi kullanarak yazar ; ve özyinmeden yazıyorlar.

Kaçınılması whileve tekrarlanması oldukça kolaydır .


Tüm girişlerin sınırlandığı belirli bir program için programın durup durmadığını belirleyebilir misiniz?

Yok hayır.

Öyleyse, dilin kısıtlamaları nelerdir ve girdi kümesinin sınırları nelerdir?

Um. Durma problemi, programın programlar hakkındaki hiçbir şeyi kendisi kadar karmaşık olarak belirleyemeyeceği anlamına gelir. Durma problemini aşmak için çok sayıda kısıtlamadan herhangi birini ekleyebilirsiniz.

Durma problemine yönelik standart yaklaşım, programlama dilinde bulunabilecek olandan biraz daha "daha zengin" bir matematiksel formalizm seti kullanan ispatlara izin vermektir.

Prova sistemini genişletmek, dili kısıtlamaktan daha kolaydır. Herhangi bir kısıtlama, kısıtlama nedeniyle tanımlanması zor olan bir algoritma için argümanlara yol açar.

Bu yapıların azami kümesi, durup durulabilecek bir dil belirler. Bu konuda yapılmış bir çalışma var mı?

Evet. Buna "Grup Teorisi" denir. Bir dizi işlem altında kapatılan bir değerler kümesi. Oldukça iyi anlaşılmış şeyler.


"Neredeyse" soruyorum biraz. Bir programın durduğu söylenebilecek sınırlı bir sınıf problemi var mı ve problem ne kadar sınırlı? Örneğin eğer if (i <10) ve sonra print (i) ifadesi tüm i için durmaz. İ alanını 32 bit tamsayılarla sınırlandırırsam, o zaman da durur.
daven11

Bir fordöngünün bir döngü olduğunu ve insanların çoğu zaman koşuldan çok daha karmaşık şeyler koyduğunu unutmayın x < 42.
Billy ONeal

@BillyONeal: İyi nokta. Python'da bir fordöngü bir yineleyici ile çalışmak için çok sıkı bir şekilde sınırlandırılmıştır. forBununla birlikte, Java’daki daha genel bir döngü, bir yineleyicinin basit kullanımını geçersiz kılan ekstra koşullar içerebilir.
S.Lott

“Bir programın durduğu söylenebilecek sınırlı bir sınıf sorunu var mı?” Cevap evet kalır. "sorun ne kadar sınırlı?" Um. Sonlu sonlu. Tüm matematiksel işlemler altında kapalı olan gerçek sayılara yaklaşmaktan ve doğal sayılara bağlı kalmaktan vazgeçerseniz, sıradan grup teorisi yapıyorsunuzdur. Modüler aritmetik. Özel birşey yok. Ne sorduğun belli değil. Modüler aritmetiğin ne olduğunu mu soruyorsunuz?
S.Lott

@ S.Lott Ben bir makinede temsil edilen sayıları, soyut anlamdaki sayıları kastetmiyorum. Yani sayıları sabit bir bit sayısı olarak düşünün. Bu sayıların tamsayılardan ve gerçeklerden biraz farklı kuralları vardır. Umarım anlamlı olur.
daven11
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.