Je sais que, dans les langages de programmation impératifs, une boucle while-do est suffisante comme construction de flux de contrôle pour rendre le langage Turing complet (en ce qui concerne le flux de contrôle - bien sûr, nous avons également besoin d'une mémoire illimitée et de certains opérateurs ...) . L'essentiel de ma question est: une boucle do-while a-t-elle la même puissance de calcul qu'une boucle while-do? En d'autres termes, une langue peut-elle être complète de Turing s'il est impossible de sauter complètement les instructions.
Je me rends compte que certaines sémantiques ici pourraient être un peu ambiguë, alors laissez-moi formuler la question réelle avec un exemple spécifique:
Brainfuck (BF) est un tarpit Turing où le seul flux de contrôle est une boucle while-do, notée [...]
(il y a une spécification de langue complète au bas de la question, au cas où vous n'êtes pas familier avec Brainfuck). Définissons un nouveau langage BF *, où ,.+-<>
ont la même sémantique que dans BF, mais au lieu de []
nous avons {}
qui dénote une boucle do-while. Autrement dit, la seule différence avec BF est que chaque boucle est exécutée au moins une fois avant que d'autres itérations puissent être ignorées.
BF * Turing est-il complet? Si c'est le cas, je serais intéressé par la façon dont je pourrais traduire BF en BF *. Si ce n'est pas le cas, comment puis-je le prouver?
Quelques observations personnelles:
- Tous les programmes BF ne peuvent pas être traduits en BF *. Par exemple, il est impossible d'écrire un programme en BF * qui peut ou non lire ou imprimer une valeur - si le programme imprime potentiellement une ou plusieurs valeurs, il en imprimera toujours au moins une. Cependant, il pourrait y avoir un sous-ensemble complet de Turing de BF qui peut être traduit en BF *.
- Nous ne pouvons pas simplement traduire
[f]
(oùf
est un programme Brainfuck arbitraire composé uniquement de+-[]<>
) en (pour tenter d'annuler l'effet de la première itération), car a) toutes les fonctions calculables n'ont pas un inverse calculable et b) même si c'était le cas, n'aurait pas nécessairement moins de boucles que si l'application de cette étape de manière récursive n'est pas garantie de se terminer en premier lieu.f-1{f}
f-1
f
Voici un bref aperçu de la langue de Brainfuck. Brainfuck fonctionne sur une bande infinie où chaque cellule contient une valeur d'octets, initialement zéro. Les débordements s'enroulent, donc l'incrémentation de 255 donne 0 et vice versa. La langue se compose de 8 instructions:
+ 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 [.
[]
ne définit pas exactement une boucle "while do" dans BF. comme dans votre tableau, les crochets gauche et droit évaluent la cellule actuelle zéro / non nulle. alors quelle est la description exacte de la {}
logique d'évaluation des accolades correspondante ? suggérer d'autres dialogues / discussions dans le chat informatique . aussi vos "observations" sont plutôt des "postulats" ou des "propositions" sans preuve.
{}
serait de {
ne rien faire du tout et de }
la même manière que ]
. Je n'aurai pas beaucoup de temps au cours des prochains jours, mais je vous rejoindrai dans le chat lorsque j'en trouverai un peu.
{}
et un prélèvement donnés []
, le BF * Turing est complet. avec la compréhension que BF []
est une construction seulement quelque chose de quelque chose comme / analogue à une boucle while-do dans les langages complets de Turing.