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]
(f
keyfi 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-1
f
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 [.
[]
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.
{}
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.
{}
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 .