görev"Mantıklı. Eğer program sonsuz bir döngü varsa, program çalışırken, program hala giriş çat" /> görev"Mantıklı. Eğer program sonsuz bir döngü varsa, program çalışırken, program hala giriş çat" />
SORU
10 Temmuz 2009, Cuma


Tam olarak durdurulması, sorunun nedir?

İnsanlar programlama ilgili olarak durdurma hakkında sorun olduğunda, insanlar "Eğer sadece bir döngü ekleme, durdurma program var ve bu nedenle otomatik hale getirebilirsiniz . yanıt ^em>görev"

Mantıklı. Eğer program sonsuz bir döngü varsa, program çalışırken, program hala giriş çatırdayan olup olmadığını, ya da eğer sadece sonsuz döngü ise bilmenin bir yolu var.

Ama bu biraz karşı sezgisel görünüyor. Kendi giriş olarak kaynak kodu alır eğer topal bir sorun yazıyordum, eğer çözücü,. rascher@localhost$ ./haltingSolver source.c

Benim kod (kaynak.c) bu gibi görünüyor:

for (;;) {  /* infinite loop */  }

Programı görmek için oldukça kolay olacak gibi görünüyor. "Döngü bak ve haline bir bakın. Eğer bu durum sadece rakamları ve hiçbir değişkene bağlı ise, o zaman, her zaman döngü sonucu. Eğer değişkenler varsa (örn: while (x < 10)), eğer bu değişkenler hiç değiştirilirse. Eğer değilse, o zaman her zaman döngü sonucu."

Kabul ediyorum, bu kontroller önemsiz olmaz (işaretçi aritmetiği, vb hesaplamak) ama imkansız görünmüyor. örneğin:

int x = 0
while (x < 10) {}

tespit edilebilir. - olmasa da basit: birlikte

int x = 0
while (x < 10)
{
   x  ;
   if (x == 10)
   {
      x = 0
   }
}

Şimdi ne kullanıcı girişi hakkında? Bu olay bir program öngörülemez hale getiriyor.

int x = 0;
while (x < 10) 
{
   scanf("%d", &x); /* ignoring infinite scanf loop oddities */
}

Şimdi benim program söyleyebilirim: Eğer kullanıcı 10 ya da daha fazla girerse", program durdurma. Diğer tüm giriş, döngü tekrar edecek."

Girdi yüzlerce olsa bile, bu demektirolmalısıralar hangi program durduracak koşullar. Bir program yazdığım zaman, gerçekten, ben her zaman birini sonlandırmak için yeteneğine sahip olduğundan emin olun! Koşullar sonuç listesi olduğunu söylemiyorumönemsizoluşturmak için, ama bana imkansız görünmüyor. Alabilirsin giriş kullanıcı, kullanım hesaplamak işaretçi dizinler, vb - ama sadece ekler sayısı koşulları sağlamak için program sonlandırılacak, yapmaz imkansız numaralandırma onları.

Tam olarak durdurulması, sorunun nedir? Ben sonsuz döngü tespit etmek için bir sorun yazmak edemeyiz fikri anlayış ne? Ya da, "" bu tür sıkça bahsedilen bir örnek? döngüler neden

GÜNCELLEME

Peki, soruyu biraz değiştirelim: durdurulması, sorunun ne olduğunubilgisayarlar için geçerlidir?Ve sonra bazı notlar şöyle yanıt verecektir:

Birçok kişi programı "rasgele giriş." ile başa çıkmak için mümkün olması gerektiğini söyledi Ama bilgisayar hiç rasgele herhangi bir giriş yok. Ben sadece veri tek bir bayt giriş, ben sadece 2^8 Olası girişler var daha. Yani, örnek olarak:

int c = getchar()

switch (c) {
   case 'q':
      /* quit the program */
}

Birdenbire, olasılıkları bir eksiğimiz var. Eğer c bit deseni varsa 0x71, öyle bir şey yok. Diğer tüm modeller için, başka bir şey yok. Hatta bir programı kabul eder rasgele bir dize girişi hiç "keyfi", beri kaynakları sınırlı, yani bu süre teorisinin "rastgele" geçerlidir... değil mi tam olarak bire bir uygulama.

İnsanlar gösterdi başka örneğidir bu

while (n != 1)
    if (n & 1 == 1) 
        n = 3 * n   1;
    else 
        n /= 2;

Eğer n bir 32-bit tamsayı ise... o zaman görsel veya bu durdurmak olup olmadığını söyleyebilirim.

Düzenle hiçbir şey istemiyor, ama gördüğüm en inandırıcı örnek this one sanırım bu:

Bir programı durdurur belirlemek için sihirli bir program/yöntem olduğunu varsayalım.

public bool DeterminesHalt(string filename, string[] args){
    //runs whatever program you tell it do, passing any args
    //returns true if the program halts, false if it doesn't
}

Şimdi kodu gibi küçük bir parça olarak yazıyoruz diyelim...

public static void Main(string[] args){
    string filename = Console.ReadLine(); //read in file to run from user
    if(DeterminesHalt(filename, args))
        for(;;);
    else
        return;
}

Bu yüzden bu örneğin, bir program durdurma sihirli yöntemimiz tam tersini yapıyor yapmak yazabiliriz. Eğer biz belirli bir programı durdurmak olduğunu bir şekilde tespit ederseniz, biz sadece sonsuz bir döngü içine hop; aksi halde program sonsuz bir döngü içinde olup olmadığını belirlemek, program sonu.

Eğer bilerek yazmak sonra tekrar, sonsuz bir döngü içeren bir program... durdurma sorunu", değil mi? tartışmalı bir çeşit "çözme

CEVAP
10 Temmuz 2009, Cuma


DÜZENLE (daha sonra orijinal cevap daha): Good Math, Bad Math MarkCC son zamanlarda somut örneklerle Durdurma sorunu excellent discussion bir yazdı.

Durdurulması, sorunun temelde bir. eğer söyleyebilirsen soran resmi yolu ya da rastgele bir program olmasın sonunda durdurma.

Diğer bir deyişle, bir yazabilir misin programı durdurma bir oracle aradı, (Program, giriş), HaltingOracle döner programı(giriş) ise true olur döndüren sonunda durdurmak ve eğer yanlış değil mi?

Cevap: hayır, yapamazsın.

Durdurulması, sorunun giriş ilgili olup olmadığı hakkında bir soru ya da kırmızı bir ringa balığı takip: Evet, giriş önemlidir. Ayrıca, bu "keyfi" daha doğru olur. burada kullanılan "sonsuz görüyorum bazı karışıklıklar var

Pratik bir örnek: QA bir pozisyonda çalışıyorsanız ve bunun için herhangi bir onay verecek durdurma denetleyicisi programı (aka oracle) yazmak için olduğunu düşününkeyfiprogram geliştirme ekibi tarafından (D) yazılı ve herhangi birkeyfigiriş son kullanıcı (ben), program Ge tarafından sağlanan en sonunda giriş I. verilen durdurma

Cue ses yöneticisi"Ho ho, bu saçma kullanıcıları da türü ne olursa olsun, sunucu görevleri hiç bitmeyen bir döngü içinde sona erecek emin olalım. Bu yüzden, kod maymun olun!"

Bu harika bir fikir gibi geliyor değil mi? Sunucunuz bağlantıyı istemezsin, değil mi?

Durdurma sorunu, size ne çözümsüz bir görev teslim ediliyor. Bunun yerine, bu özel durumda, bir eşik süresi geçmiş görevler için plan ve onları iptal etmek için hazır olman gerekiyor.

Mark kodu yerine giriş sorunu göstermek için kullanır:

def Deciever(i):
  oracle = i[0]
  in = i[1]
  if oracle(Deceiver, i):
    while True:
      continue
  else:
    return i

Yorum benim tartışma, kötü niyetli bir giriş manipülasyon rota çözülemeyen bir sorun zorlamak için gittim. Mark örnek çok daha zarif, durdurma oracle kendisini yenmek için kullanıyor:

Yani Dolandırıcı olarak girdi aslında. iki öğe listesi: birinci önerilen topal bir oracle. Bu ikinci bir giriş. Ne katilden durdurma Oracle sormak. “Ben giriş için halt edeceğimi mi sanıyorsun?”. Eğer kahin, “Evet, olacak diyorsa ” o zaman bu program bir gider dur sonsuz döngü. Eğer kahin “Hayır diyorsa halt olmaz”, sonra durur. Yok yani kahin ne derse desin, yanlış.

Başka bir yol, hile yapmadan, girişleri yeniden biçimlendirme dedi, / sayılamayan sonsuz sayılabilir ya da diğer dikkat dağıtıcı bir şey, Mark yenemez kodu bir parça yazmışherhangi birdurdurma oracle program. Olamaz Deceiver hiç durur sorusuna cevap oracle bir yaz.

Orijinal cevabı:

Büyük Wikipedia:

Hesaplanabilirlik teorisi, oyunda sorun olan karar bir sorundur aşağıdaki gibi ifade edilebilir belirli bir bir program ve bir sonlu açıklaması giriş, karar program olsun çalışan ya da sonsuza kadar çalışır bitirir giriş verilmiş.

Alan Turing 1936 yılında kanıtladı genel durdurulması çözmek için algoritma tüm olası sorun programı-giriş çift olamaz. Bu söylediğimiz durdurma problemi üzerinde undecidable. Turing makineleri. Copeland (2004) gerçek süreli durdurma öznitelikleri Martin Davis için sorun.

Kritik noktalardan biri ya da program ya da giriş üzerinde hiçbir kontrole sahip olmasıdır. Bu teslim ve soruyu cevaplamak için.

Turing makineleri hesaplanabilirlik etkili modeller için temel olduğunu unutmayın. Diğer bir deyişle böyle modern bilgisayar dilleri, yaptığınız her şeyi bu prototip Turing makineleri eşleştirilmiş olabilir. Sonuç olarak durdurulması, sorunun herhangi bir yararlı modern dil undecidable.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Floortile83

    Floortile83

    16 Ocak 2010
  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • KSI

    KSI

    25 Temmuz 2009