Est-Stata Turing-complet?
-
10-10-2019 - |
Question
J'ai fait quelques statistiques travail avec Stata récemment et ne bénéficiant pas de beaucoup.
en particulier, je ne suis pas penser il y a un moyen de boucle jusqu'à ce qu'une condition soit remplie:Il ne se sent pas à moi comme c'est une programmation « correcte » la langue.
Ai-je raison dans mon sentiment, ou est Stata vraiment Turing-complet?
La solution
Je ne l'ai jamais entendu parler de Stata avant, mais la page Web se vante qu'il a « si, tout en »et " en boucle et de branchement ".
local k = 1
file open myfile using toto.txt, read text
file read myfile line
while r(eof) == 0 {
local k = `k' + 1
di "`k' `line'"
file read myfile line
}
file close myfile
Je ne sais pas ce que « bon » langage de programmation moyens, mais à première vue, il semble certainement être Turing-complet.
Autres conseils
Un langage de programmation « correcte » dans le sens que vous pourriez construire une page Web ou l'interface graphique avec elle? Bien sûr que non. Mais c'est un peu extrême. Vous pouvez certainement écrire des boucles avec .ado et .DO fichiers; Je dirais qu'il est Türing complet.
@ eric.a.booth: Je pense que votre exemple est étrange. Je ne suis pas sûr que je l'ai jamais vu while { ... } else {...}
En outre, notez que Stata ne teste pas la boucle avant de l'exécuter, et se permettre de se coincer dans une boucle infinie.
local x = 0
while `x'<5 {
display `x' / 2
local ++x
}
Alors que vous pouvez utiliser les -while-, -si, commandes -Else- pour effectuer une boucle jusqu'à ce qu'une condition est remplie, il est généralement une meilleure idée Stata d'utiliser le -foreach- ou boucles -forvalues- à leur place.
Ainsi, au lieu de dire:
while "`1'" != "" {
<do something>
}
ou
if "`a'" == "" {
<do something>
}
else {
<do something else>
}
il est généralement préférable (et plus intuitive) à la place de le faire:
forvalues x = 1/100 {
<do something>
}
- Non -if-, -Else- ou conditions -break- nécessaires. Voir -help forvalues- ou -help foreach- Stata pour plus de détails.
^ NOTE: le tout-autre boucle dans mon post original a été retiré - merci pour les heads-up, Keith. La partie -Else- était destinée à la si {]} else {exemple de boucle uniquement. Quel que soit le point de mon poste était de ne pas suggérer l'utilisation d'un certain temps / autre ou si / boucle d'autre, il était que -foreach - / -. Forvalues- sont généralement une approche préférée
La langue ado
de Stata a toutes les déclarations conditionnelles habituelles:
Cependant, il est important que l'on ne confondons pas:
En outre, les constructions de boucle de langage ado
Stata comprennent:
-
for (une commande out-of-date de Stata 8)
Mata
, langage de programmation de la matrice de Stata prend également en charge:
Par conséquent, ado
et les langages de programmation de mata
des deux Stata semblent
satisfaire aux critères requis pour caractériser complète Turing.
Il est important de noter cependant que ce sont pas Programmation générale langues , mais à part entière langues statistiques .