Bir do-while döngüsü Turing eksiksizliği için yeterli midir?


22

Zorunlu programlama dillerinde, bir süre bitim döngüsünün dili Turing'in tamamlaması için bir kontrol akışı kurgusu olarak yeterli olduğunu biliyorum (kontrol akışı devam ettiği sürece - tabii ki sınırsız belleğe ve bazı operatörlere de ihtiyacımız var ...) . Benim sorumun özü şudur: bir süre-süresi döngüsü, bir süre-süresi döngüsü ile aynı hesaplama gücüne sahip midir? Başka bir deyişle, bir talimatı tamamen atlamak mümkün değilse, bir dil Turing-complete olabilir.

Buradaki anlambilimden bazılarının biraz belirsiz olabileceğinin farkındayım, bu yüzden asıl soruyu belirli bir örnekle ifade edeyim:

Brainfuck (BF), tek kontrol akışının [...](Brainfuck'a aşina olmamanız durumunda sorunun altında tam bir dil belirtimi vardır) belirtilen bir döngü döngüsü olduğu bir Turing tarpit'idir . BF ,.+-<>ile aynı semantiklere sahip yeni bir BF * dili tanımlayalım , fakat bunun yerine bir süre bitim döngüsünü ifade eden []biz varız {}. Diğer bir deyişle, BF'ye tek fark, her döngünün, daha fazla yinelemenin atlanabilmesi için en az bir kez yürütülmesidir.

BF * Turing tamamlandı mı? Eğer öyleyse, BF'yi BF'ye * nasıl çevirebileceğimi merak ediyorum. Öyle değilse, bunu nasıl kanıtlarım?

Kendime ait bazı gözlemler:

  • Her BF programı BF'ye * çevrilemez *. Örneğin, BF * 'de bir değeri okuyan veya yazamayan bir program yazmak imkansız - program potansiyel olarak bir veya daha fazla değer yazdırıyorsa, her zaman en az birini yazdırır. Ancak, BF'ye * çevrilebilecek bir Turing-komple BF alt kümesi olabilir.
  • Basitçe [f]( fkeyfi olan bazı durumlarda Brainfuck programını yalnızca bunlardan oluşan +-[]<>) (ilk yinelemenin etkisini iptal etme çabasıyla) çeviremiyoruz, çünkü a) her hesaplanabilir fonksiyonun hesaplanabilir bir tersi ve b) olmasa bile, mutlaka daha az döngüye sahip olmazdı, bu yüzden bu adımı tekrar tekrar uygulamak, ilk etapta sonlandırmak için garanti edilmez.f-1{f}f-1f

Brainfuck dili üzerine genel bir bakış. Brainfuck, her bir hücrenin başlangıçta sıfır olan bir bayt değeri içerdiği sonsuz bir bant üzerinde çalışır. Taşmalar etrafa sarılır, bu nedenle 255 arttırma 0 verir ve bunun tersi de geçerlidir. Dil 8 talimattan oluşmaktadır:

+   Increment the current cell.
-   Decrement the current cell.
>   Move tape head to the right.
<   Move tape head to the left.
,   Input a character from STDIN into the current cell.
.   Output the current cell as a character to STDOUT.
[   If the current cell is zero, jump past the matching ].
]   If the current cell is non-zero, jump back to just behind the matching [.


ilginç ama tamamen dikkatlice inşa edilmediğini düşünüyorum. []BF'de "sürerken" bir döngü tanımlamıyor. Masanızdaki gibi, sol ve sağ parantezler mevcut hücreyi sıfır / sıfırdan farklı olarak değerlendirir. peki karşılık gelen {}parantez değerlendirme mantığının tam açıklaması nedir? Bilgisayar Bilimi Sohbetinde daha fazla iletişim / tartışma önerebilir . aynı zamanda "gözlemleriniz", kanıt olmadan "varsayımlar" veya "önermeler" gibidir.
vzn

@vzn Bunlar iyi noktalar. Ben bariz tanım düşündüm {}yapmak olacaktır {hepsi ve hiçbir şey yapmama }aynı ]. Önümüzdeki birkaç gün boyunca fazla zamanım olmayacak, ancak biraz zaman bulduğumda sohbetinize katılacağım.
Martin Ender

ne yazık ki bu görünüşte sormak için biraz ince ve burada tamamen farklı iki soru var gibi görünüyor. (1) herhangi bir Turing tam diline bir süre bitim döngüsüyle (ve "diğer şeyler") verilirse, bunun yerine yalnızca bir süre bitim döngüsüyle Turing tam diline dönüştürülebilir. ama sonra cevaplamak için ayrıntılı olarak "diğer şeyler" hakkında daha fazla bilgi sahibi olmak gerekiyor. (2) Belirli bir bf ve verilen tanımı ile yeni bir BF * {}ve götürüp []BF * Turing tamamlanır. BF'nin [], tam dil Turing'de bir süre bitim döngüsüne benzeyen / ona benzer bir yapı olduğu anlayışıyla .
vzn

1
@vzn kısım (1) sadece TL, DR sorumun parçasıydı. Bunun "bazı diller" için cevap vermenin muhtemelen mümkün olmadığını tamamen biliyorum. Gerçekten çok basit bir oyuncak dilin (BF) açısından asıl soru ifadelerle ben de düşündüm, çünkü (döngü davranışına daraltmak bu yüzden mi eğer BF * daha basit hale getireceğini TC'yi olduğu gösterilebilir sadece-süre döngüleri olan diğer diller için göstermek için). BF döngülerinin, diğer dillerin while-do döngülerinden nasıl farklı olduğunu düşündüğünüzden emin değilim.
Martin Ender

Yanıtlar:


10

Brainfuck'ı tanımıyorum, bu yüzden sözde kodumdan çeviri yapmanız gerekecek. Ancak, Brainfuck'ın makul şekilde (ha!) Davrandığını varsayarsak, aşağıdaki her şey geçerli olmalıdır.

do-while, süresi ile aynıdır. do X while Yeşittir X; while Y do Xve koşullu olduğunuzu varsayarsak while Y do Xeşdeğerdir if Y then (do X while Y).

Koşulsuz yoksa hayat biraz daha zor. Eğer bunu yaparken, böyle bir if Y then Xşey kullanarak taklit edebilirsiniz :

B := true
while (Y and B) do
    X
    B := false
endwhile

Ama ya sadece sürebilirse? Aşağıdaki Simülasyonu iddia if Y then X, varsayarak Xsonlandırıldığında değişkenlerin güncel değeri verilmiştir. (Bu garanti edilmez: değişkenlerin herhangi bir değeri için döngüye rağmen program if y=0 then loopforeversonlandırılır ). Let , ..., modifiye değişkenler ve let olmak o kullanması değiştirildiği yerine bu değişkenlerin her biri için. değişkenleri değiştiren açık kodu belirtir ve .y != 0XV1VnXX'XVi'Viswap(A,B)AB

V1' := V1; ...; Vn' := Vn
V1'' := V1; ...; Vn'' := Vn
C := 0
do
    X'
    swap (V1',V1''); ...; swap (Vn',Vn'')
    C := C+1
while Y and C<2
V1 := V1'; ...; Vn := Vn'

Fikir şudur. İlk önce, bunun Yyanlış olduğunu varsayalım . Bir Xkez yapmayı taklit ediyoruz ve sonuçları V1'', ..., Vn''; V1', ..., Vn'özgün değerleri tutmak V1, ..., Vn. Sonra, V1 := V1'; ...; Vn := Vn'hiçbir şey yapmadan atayacağız . Yani, eğer Yyanlışsa, hiçbir şey yapmadık. Şimdi, bunun Ydoğru olduğunu varsayalım . Şimdi sonuçları "hem astarlanmış" hem de "çift astarlanmış" değişkenlerde saklayarak X iki kez simüle edeceğiz . Yani, şimdi, döngünün sonundaki atamalar bir Xkez hesaplanan etkiye sahiptir . Not Ydeğeri tekrar tekrar döngü çalışan etkilenmez yani sadece, "prime edilmemiş" değişkenlere bağlıdır.

Tamam, peki ya Xdeğişkenlerin şu anki değerini sonlandırmayabilirsek? (Bu olasılığa işaret ettiği için Martin Ender'e teşekkürler.) Bu durumda, Xyukarıdaki talimatlara benzer fikirler kullanarak talimatla talimat simülasyonu yapmamız gerekiyor . Her komut kesinlikle sona ermektedir, böylece ifyukarıdaki kodu çözerek kod çözme işlemi yapmak için "Opcode foo ise, bunu yapın; bar ise, bunu yapın; ..." satırları boyunca kullanabiliriz. Şimdi, Xbir talimat göstergesini kullanarak komutları yinelemek için bir döngü kullanıyoruz, böylece daha sonra hangi komutu çalıştıracağımızı biliyoruz. Döngünün her yinelemesinin sonunda, henüz Ydurup Xdurmadığını kontrol edin ve kontrol edin . Eğer Yyanlış, takası tekniği etkilerini ortadan kaldırmaya bizi tanırXilk talimatı.


1
Bu güzel bir fikir, ancak burada bir sorun olduğunu düşünüyorum: Yyanlış olan durumu düşünün, ancak Xmevcut değişken değer kümesinde sonlanmaz. if Y then Xsonlanır, ancak çeviriniz gerçekleşmez, çünkü her zaman X'en az bir kez çalıştırılması gerekir .
Martin Ender

1
@ MartinBüttner Urgh. Haklısın. Bu yüzden benzetmek için döngü kullanmamız gerekirX talimat talimatlarını kullanmalı ve Yher talimattan sonra kontrol . Her talimatın sona ermesi garantilidir, böylece her şey çalışacaktır. Ama yazmak için bir acı.
David Richerby 27:15

1
XBir süre döngü / şartlı kendisi ile başlarsa böyle bir yapıyı kaldırmak mümkün olup olmadığından tam olarak emin değilim . Bunun hakkında biraz daha düşünmeliyim.
Martin Ender

Ayrıca, "Şimdi, X'in komutlarını yinelemek için, bir komut göstergesini kullanarak yinelemek için bir döngü kullanıyoruz, böylece daha sonra hangi komutun uygulanacağını biliyoruz." Bunun kendi içinde bir tür şartlı gerektirebileceğini düşünüyorum.
Martin Ender

1
X'Doğrusal değilse , "her bir talimatı" nasıl tanımladığınızdan hala tam olarak emin değilim . Basit ama önemsiz bir oyuncak için biraz daha ayrıntı dahil eder misiniz X? Örn do (while A do B) while C? (dış şu anda çevirmekte olduğumuz dıştan do whilegeliyor while do)
Martin Ender
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.