Turing'in “Durma problemini” çözme algoritması


23

"Alan Turing, 1936'da, olası tüm program giriş çiftleri için durma problemini çözmek için genel bir algoritma bulunmadığını kanıtladı. "

Bazı olası program giriş çiftleri için durma problemini çözmek için genel bir algoritma bulabilir miyim ?

Bu dilde her tür program için programın sonlandırılıp sonlandırılmayacağına karar verebileceği bir programlama dili (veya dil) bulabilir miyim?



3
CACM : Mayıs ayında çok ilginç bir yazı vardı Programı Fesih Kanıtlama
Christoph Walesch

3
"bazı olası program giriş çiftleri için genel bir algoritma [...]" - bu, kendisiyle çelişkili olmaya yakın. Sanırım kendinizi tüm programların sonsuz bir alt sınıfı ile sınırlandırmak mı istiyorsunuz?
Raphael

Yanıtlar:


25

Bazı olası program giriş çiftleri için durma problemini çözmek için genel bir algoritma bulabilir miyim?

Evet elbette. Örneğin, ne döngüleri ne de özyinelemeyi içeren herhangi bir program için "Evet, sonlandırır" ve while(true)kesinlikle ulaşılacak ve içermeyen bir döngü içeren herhangi bir program için "Hayır, sonlandırmaz" döndüren bir algoritma yazabilirsiniz bir mola ifadesi ve her şey için "Dunno".

Bu dilde her tür program için programın sonlandırılıp sonlandırılmayacağına karar verebileceği bir programlama dili (veya dil) bulabilir miyim?

Bu dil Turing-tamam ise hayır.

Ancak , Halting Probleminin kararlaştırılabildiği Coq , Agda veya Microsoft Dafny gibi Turing olmayan tam diller vardır (ve aslında kendi tip sistemleri tarafından kararlaştırılır, bu da toplam dil olmalarını sağlar (yani, sonlandırılmayacak bir program derleme)).


1
İlkel özyinelemeli fonksiyonların sınıfı, durdurma probleminin önemsiz şekilde kararlaştırılabildiği iyi bilinen bir "programlama dilidir".
Raphael

Tüm programların son derece uygun şekilde sonlandırıldığı birkaç " toplam fonksiyonel programlama " dili vardır.
Anderson Green,

3

Bence buradaki tüm cevaplar tamamen ve kesinlikle noktayı özlüyor. Sorunun cevabı şudur: programın durması gerektiğini varsayarsak, evet, durduğunu daha iyi gösterebildiniz. Kolayca durduğunu gösteremiyorsanız, program çok kötü yazılmış sayılmalı ve Kalite Kontrol tarafından reddedilmelidir.

Gerçekten uygun bir makine algoritması yazıp yazamayacağınız, giriş programlama diline ve ne kadar hırslı olduğunuza bağlıdır. Bir programlama dilinin sonlandırmayı ispat etmeyi kolayca mümkün kılması makul bir tasarım hedefidir.

Eğer dil C ++ ise muhtemelen aracı yazamazsınız, aslında sonlandırmayı ispatlamanıza rağmen, ayrıştırıcıyı çalıştırmanız pek mümkün değildir. Daha iyi yapılandırılmış bir dil için, bir kanıt üretebilmeli ya da en azından belirli varsayımlarla yapmalısınız: İkinci durumda, araç bu varsayımları çıkarmalıdır. Benzer bir yaklaşım, dilde sonlandırma iddialarını dahil etmek ve bunları aracın iddialara güveneceği karmaşık durumlarda kullanmak olacaktır.

Sonuç olarak, hiç kimsenin bir programın durduğuna dair kanıtın gerçekten mümkün olmadığını, çünkü böyle iyi durma programları yazmayı amaçlayan (iyi) programcılar her zaman kasıtlı olarak yaptıklarını ve neden doğru bir şekilde sonlandırdıklarını ve hareket ettiklerini zihinsel bir şekilde düşündüklerini: Durdukları ve doğru oldukları açıktır ve makul bir algoritma bunu kanıtlayamazsa, muhtemelen bazı ipuçlarıyla, program reddedilmelidir.

Önemli olan: programcılar keyfi programlar yazmazlar, bu nedenle durma teoreminin tezi tatmin olmaz ve sonuç geçerli olmaz.


4
Bence konuyu tamamen ve tamamen özleyen sensin. Cevabınızın ilk paragrafı soruya uygulanmaz çünkü algoritmalar hakkında bir soru sormaktadır - bir insanın kanıtlayabileceği veya kanıtlayamadığı şeyler. Cevabın geri kalanı, sorunun ilk paragrafına cevap verir, yani bir algoritmanın bazı programlar için sonlandırmayı kanıtlayıp kanıtlayamayacağı . Önceki cevapların herkes zaten buna "evet" dedi.
sepp2k

3
Yeterince basit bir Turing-complete dilinde her iyi yazılmış programın sonlandırılmasını ispatlayabilecek bir algoritma yazmanın mümkün olduğu iddiası tamamen yanlıştır. Sonlandırmayı kanıtlamaya çalışan her olası algoritma için, bu sorunu çözen her programın bu algoritma tarafından durdurulamayacağı kanıtlanmış problemler vardır . Yani, bu problemi çözen her programın tanımı gereği (gülünç olur) kötü yazıldığını söylemediğiniz sürece, bu, amacınızı yanlışlar.
sepp2k

1
@Sam Birisi bana bazı kodların durup durmadığını sorarsa, koda bakacağım ve anlamaya çalışacağım. Ama ben bir algoritma değilim. Ve evet, bir programın birçok program için durup durmadığını kontrol edebilecek bir algoritma yazmak mümkündür. Ama Yttrill öyle demedi. Yttrill, iyi yazılmış tüm programlar için mümkün olduğunu söyledi. Ve önceki yorumumda dediğim gibi, belli sorunların yalnızca kötü yazılmış programlar tarafından çözülebileceğini iddia etmediğiniz sürece (ki yine gülünç olur) bu yanlış.
sepp2k

1
Sam, "kasıtlı olarak durdurmak için yazılmış programların koşulların durdurulması için kolayca analiz edilebileceği bana basit geliyor" - öyleyse, neden böyle araçlara sahip değiliz? Sanki insanlar denemiyor gibiydi. (Bir suçlu, yöntem geçersiz kılmadır: derleme zamanında, yürütülecek tüm kodları bilmiyorsunuz.)
Raphael

1
@Sam "sonsuz bir döngü var", gerçek dünya döngüsü için bile yaklaşılması zor bir şey. Elbette loop değişmezleri nasıl bulacağımı öğrenmiştim, ama bu çoğu durumda bir tanesini (kolayca) bulabileceğim anlamına gelmiyor. Bildiğim kadarıyla, bugünlerde tahmin et ve ispat et. Yine, orada eğer vardı makul genel algoritmalar, onları (majör derlemesinin veya IDE dahil edilecek beklenir yapmak bazı önemsiz, sözdizimsel denetimleri gerçekleştirmek). Oldukça güçlü bir algoritmaya referans verebilir misiniz?
Raphael

3

mükemmel ve (istemeden derinlemesine prob) soru. Sınırlı girdi kümesinde başarılı olabilecek durma tespit programları var. aktif bir araştırma alanı. teorem kanıtlama alanlarıyla (otomatize) çok güçlü bağları var.

Ancak bilgisayar bilimi, "bazen" başarılı olan "programlar" için tam bir terim olarak görünmemektedir. "algoritma" kelimesi genellikle daima durduran programlar için ayrılmıştır.

Bu kavram , CS teorisyenlerinin başarılı olmalarında bilinen veya hesaplanabilir bir olasılık olduğu konusunda ısrar ettikleri olasılıksal algoritmalardan açıkça farklı görünüyor .

Bazen kullanılan bir terimbilimsel terim vardır ancak yinelemeli olarak sayılabilir veya hesaplanamaz gibi görünüşte eş anlamlıdır.

bu yüzden buradaki amaçlar için onlara quasialgorithms diyoruz . kavram karar verilemeyenden farklı, kararsız olandan farklı.

kişi quasialgorithmleri karşılaştıramayacağını söyleyebilir. ama aslında bu quasialgoritmaların doğal bir hiyerarşisi (kısmi bir düzen) var gibi gözüküyor. farz edelim ki bir quasialgorithm , bazı sınırlı giriş programlarının durmasının X olduğunu söylüyor . bir diğeri B , bir Y ayarının durduğunu tespit edebilir . eğer X Y yani X'in ise uygun alt kümesi Y ardından B "daha güçlü" olduğunu A .AXBYXYXYBA

CS’de bu “yarı algoritma hiyerarşisi” çoğunlukla şu ana kadar gayrı resmi olarak incelenmiştir.

yoğun kunduz araştırmasında [1] ve PCP probleminde [2] ortaya çıkmıştır. Aslında PCP'ye DNA tabanlı bir bilgisayar saldırısı quasialgorithm olarak görülebilir. [3] ve teorem ispat etme [4] gibi daha önce not edilen diğer alanlarda görülmüştür.

[1] Yoğun kunduz sorununa yeni millenium saldırısı

[2] Zhao tarafından yazışma yazışma problemi (v2?)

[3] Sınırlı Yazışmalarda Yazışma Problemini çözmek için DNA'yı Kari ve ark.

[4] kanıtlayan programı sonlandırma ve ark Cook, Comm. ACM’nin

(bu yüzden aslında Defn, TCS'de olmayı hak eden çok derin bir sorudur. imho ... belki birileri oraya sığacak ve kalacağı şekilde tekrar sorabilir.)


ACM, quasialgoritlerin ne kadar güçlü olabileceğinin etkileyici bir örneği olarak, ACM ackermanns fonksiyonunun bir quasialgorithm tarafından durdurulduğu kanıtlanabileceğini öne sürüyor, ancak tüm ilkel özyinelemeli fonksiyonlardan daha büyük.
vzn

1
"algoritma" sözcüğü genellikle her zaman durdurulan programlar için ayrılmıştır. " - Bunun doğru olduğundan emin değilim. Etrafında kısmen sonlandırıcı algoritmalar var (özellikle doğrulamada) ve "algoritma" demeyen hiç kimseyi duymadım.
Raphael

"algoritmanın" gayrı resmi kullanımları vardır. "kısmen sonlandırma" fena değil ama prob nonstd. Belirtildiği gibi, henüz terimin zorlaştığı görünmemektedir. wikipedia, bir algoritmayı etkin bir yöntem olarak tanımlar; yani aşağıdaki özelliklerle karar verilebilir (1) hiç cevap vermemek yerine her zaman bir cevap verir; (2) her zaman doğru cevabı verin ve asla yanlış cevabı vermeyin; (3) daima sonsuz bir sayıdan ziyade sınırlı sayıda adımda tamamlanmalıdır; (4) sınıfın bütün problemleri için çalışır.
vzn

ve daha sonra aynı makalede, "etkili yöntem" teriminin başka bir açıklamasında, yöntemin etkili olduğu sınıfın dışından bir sorun verildiğinde, yöntemin durmadan durması veya sonsuza kadar dönmesi gerekliliği içerebileceği yazılıdır. , ancak sorunun cevabı sanki bir sonuç döndürmemeliyiz. " yani neredeyse kendisi ile çelişiyor!?! çok açık bir şekilde, dikkat çekici bir şekilde, kilit meselede gerçek bir karışıklık var ve mevcut terminoloji kesin değil. "algoritma" daha bir yakın kelimeyi not bin yıllık eski ya da öylesine & .... ölçüde kaymıştır
vzn

Doğru: geleneksel anlam, Vikipedi'nin söylediği gibi muhtemelen "etkili yöntem" dir. bazı girdiler). Bunun 1950'lerden bu yana değiştiğini düşünüyorum; Söylediğim gibi, bugün insanlar açıkça kısmi bir sonlandırma yöntemine "algoritma" diyorlar.
Raphael

2

Söz konusu programlama dili yeterince karmaşık olduğu sürece (yani Turing tamamlanmışsa), o zaman dilde hiçbir programın sonlandırmayı kanıtlayamayacağı programlar vardır.

En ilkel diller hariç tümü Turing tamamlandı (sadece değişkenler ve koşullamalar gibi bir şey alır) olduğundan, gerçekten durma problemini çözebileceğiniz çok küçük oyuncak dilleri oluşturabilirsiniz.

Düzenleme: Yorumlar ışığında, daha açık konuşayım: Durma problemini çözebileceğiniz, tasarlayabileceğiniz herhangi bir dilin mutlaka Tamamlanmamış olması gerekir. Bu, uygun bir temel bileşenler kümesi içeren herhangi bir dili (örneğin, "değişkenler, koşullamalar ve atlamalar" veya @ sepp2k'nin dediği gibi, genel bir süre "-loop" olduğu zaman hariç tutar.

Görünüşe göre bunun gibi birkaç pratik "basit" dil var (örneğin, Coq ve Agda gibi teorem çözücüler). Bunlar bir "programlama dili" fikrinizi yerine getirirse, bir tür bütünlüğü sağlayıp sağlamadıklarını veya durma sorununun onlar için çözülebilir olup olmadığını araştırabilirsiniz.


3
“En ilkel diller dışındakilerin hepsi Turing tamamlandı (bu sadece değişkenler ve şartlar gibi bir şey alır) çünkü” doğru değil. Her şeyden önce, en azından özyinelemeye ya da bir tür döngü yapısına ihtiyaç duyacaksınız (ki bu bir süre döngüsü kadar güçlü olmalıdır - basit bir sayma döngüsü yeterli değildir). İkincisi, Coq ya da Agda gibi dilleri çağıracak çok sayıda insan olduğunu düşünmüyorum (toplam ve dolayısıyla tam anlamıyla tamamlanmadı) ilkel ya da oyuncak dilleri.
sepp2k

@ sepp2k: Evet, evet. Peano aritmetiği de oldukça kullanışlıdır ve Turing tamamlanmaz. Sanırım basitleştirilmiş bir ifade. Eğer OP problemi yeterince biliyorsa, teknik detayları doldurmayı umar.

3
"Yeterince karmaşık" olmakla Turing-tamamlanmak arasında büyük bir boşluk var. Coq gerçekten karmaşık ve çok çeşitli pratik işler için uygundur.

1
@Kerrek SB Turing-complete dilinin, fesih için ispat edilebilecek şekillerde kullanılması mümkündür. Özyinelemeli bir formülün her zaman sonlandırma koşuluna (faktoring işlevi gibi) yaklaştığını kanıtlayabilirseniz, her tür özyinelemeyi idare edemeseniz bile sona erdiğini kanıtlayabilirsiniz.

@ArtB: Elbette, sonlandırdığı kanıtlanmış bazı programlar vardır. OP'nin ilk sorusu bu konuda ipucu verebilir, ancak tam olarak takip ettiğimden emin değilim. Örneğin, herhangi bir program ailesinin sonlanıp sonlanmayacağını belirleyen bir "jenerik algoritmaya" sahip olamazsınız, bunun tersine , muhtemelen bir fonksiyonun o aileye ait olduğunu varsayarak algoritmik olarak söyleyebildiğinize göre sınırlı bir fonksiyonlar ailesi oluşturabilirsiniz. sonlandırır. (Bu ailenin önemsiz olup olmayacağından emin değilim. Sanırım yapabilir ama bir örnek

2

TT

Bu oldukça önemsiz. Herhangi bir durdurucu TZ alt kümesinin ve hiç durmayan TZ alt kümesinin birleşimini üstlenirsek, sonuç, durdurma sorununun giderilebileceği bir TT dizisi olacaktır (her ikisi de paralel olarak çalışacaksa, birincisi TT'yi kabul ederse) ikincisi kabul ederse durur, sonra makine durmaz). Ancak bu çok ilginç dillere yol açmayacak.

birLOgTbenmecM


1

Evet yapabilirsin, ama yararlı olacağından şüpheliyim. Muhtemelen bunu vaka analizi yapmak zorunda kalacaksınız ve sonra sadece en açık davaları arayabileceksiniz. Örneğin, kod için bir dosyayı grep edebilirsiniz while(true){}. Eğer dosyada bu kod varsa, asla sonlandırılmaz. Daha genel olarak, döngü veya özyineleme içermeyen bir programın her zaman sonlanacağını ve bir programın sonlandırılacağını veya sonlandırılmayacağını garanti edebileceğiniz birkaç durum olduğunu söyleyebilirsiniz, ancak orta büyüklükteki bir program için bu çok zor olacaktır ve Çoğu durumda size bir cevap veremezsiniz.

tl; dr: Evet, ancak en kullanışlı programlar için faydalı olmasını sağlayamazsınız.


^ Evet, teknik olarak bu kod kod yolunda değilse veya hala sonlandırabileceği başka başlıklar varsa, ancak burada genel bir noktaya değiniyorum.


4
Coq ve Agda'nın neden faydalı olmadığını düşünüyorsunuz? Turing-eksiksizliğinin değerini abartıyorsun.

Coq kullandım, ancak iddialarım hala geçerli çünkü çoğu ticari yazılım Java / C ++ / Ruby / C # dilinde yazılmıştı. İnsanların% 90'ı yazı ile ilgilenen programların yararı olmaz. Temel olarak, eğer Coq / Agda vs. hakkında bir şey bilmiyorsanız, bunun için hedef pazar değilsiniz demektir.

5
Gerçek dünyadaki programların% 99'unun, bir dilin Turing tamamlanmamış bir alt kümesinde uygulanmasından fayda sağlayacağını söyleyebilirim. Ackermann işlevini her gün uygulayamazsınız. CRUD’nun% 100’ünün “gerçek” bir dile ihtiyacı yoktur. Veri işleme neredeyse her zaman önemsizdir. Terminator projesine bakın - hatta gerçek dünya işleri (sürücüler ve diğer düşük seviye kodlar dahil) için fazlasıyla yeterli olan C ++ programlarının iyi bir alt kümesine bile hizmet ediyorlar.

Gerçek dünyadaki projelerin çoğu Turing-complete dillerinde yazılmış kütüphaneleri tekrar kullanmak ve IDE'leri ve hata ayıklayıcılarını ve eğitimlerini kullanmak istiyor. Evet, Turing dışındaki dillerde bir şeyler başarabilirsiniz, ancak bazılarının aslında "X yapmak istiyorum" ve cevabımın "Coq Kullan" olduğunu söyleyemiyorum. Beni Terminator Projesi ile tanıştırdığın için teşekkürler .

4
İş mantığının düşünülemez derecede büyük bir bölümü, halihazırda tamamlanmamış bir SQL'de uygulanmaktadır. DSL ve eDSL'ler şimdi artıyor. Bu nedenle, yakında iş uygulamaları programcılarının çoğu tüm "genel amaçlı" dilleri unutacaktır.
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.