LOOP (langage de programmation) - LOOP (programming language)
LOOP est un langage de registre simple qui capture précisément les fonctions récursives primitives . Le langage est dérivé du modèle de la contre-machine . Comme les compteurs, le langage LOOP comprend un ensemble d'un ou plusieurs registres non bornés , chacun pouvant contenir un seul entier non négatif. Quelques instructions arithmétiques (comme 'Clear', 'INCrement', 'DECrement', 'CoPY', ...) opèrent sur les registres. La seule instruction de flux de contrôle est ' LOOP x DO ... END' . Il provoque la répétition x fois des instructions comprises dans son champ d'application. (Les modifications du contenu du registre x pendant l'exécution de la boucle n'affectent pas le nombre de passes.)
Histoire
Le langage LOOP a été formulé dans un article de 1967 par Albert R. Meyer et Dennis M. Ritchie . Ils ont montré la correspondance entre le langage LOOP et les fonctions récursives primitives .
La langue était également le sujet de la thèse de doctorat non publiée de Ritchie.
Il a également été présenté par Uwe Schöning , avec GOTO et WHILE .
Philosophie de conception et fonctionnalités
Contrairement aux programmes GOTO et WHILE, les programmes LOOP se terminent toujours . Par conséquent, l'ensemble des fonctions calculables par les programmes LOOP est un sous-ensemble approprié de fonctions calculables (et donc un sous- ensemble des fonctions calculables par les programmes WHILE et GOTO).
Meyer & Ritchie ont prouvé que chaque fonction récursive primitive est calculable en BOUCLE et vice versa.
Un exemple d'une fonction calculable totale qui n'est pas calculable en boucle est la fonction Ackermann .
Définition formelle
Syntaxe
Les programmes LOOP se composent des symboles LOOP
, DO
, END
, :=
, +
et ;
ainsi que d'un nombre quelconque de variables et de constantes. Les programmes LOOP ont la syntaxe suivante sous la forme Backus–Naur modifiée :
Ici, sont des noms de variables et sont des constantes.
Sémantique
Si P est un programme LOOP, P est équivalent à une fonction . Les variables à travers dans un programme LOOP correspondent aux arguments de la fonction , et sont initialisées avant l'exécution du programme avec les valeurs appropriées. Toutes les autres variables reçoivent la valeur initiale zéro. La variable correspond à la valeur qui prend lorsqu'on lui donne les valeurs d'argument de à .
Un énoncé de la forme
xi := 0
signifie que la valeur de la variable est définie sur 0.
Un énoncé de la forme
xi := xi + 1
signifie que la valeur de la variable est incrémentée de 1.
Un énoncé de la forme
P1; P2
représente l'exécution séquentielle des sous-programmes et , dans cet ordre.
Un énoncé de la forme
LOOP x DO P END
signifie l'exécution répétée du programme partiel un total de fois, où la valeur qui a au début de l'exécution de l'instruction est utilisée. Même si change la valeur de , cela n'affectera pas le nombre d' exécutions dans la boucle. Si a la valeur zéro, alors n'est pas exécuté dans l' instruction LOOP . Cela permet des branches dans les programmes LOOP, où l'exécution conditionnelle d'un programme partiel dépend du fait qu'une variable a la valeur zéro ou un.
Créer des « instructions de commodité »
A partir de la syntaxe de base, on crée des "instructions de commodité". Ce ne seront pas des sous-programmes au sens conventionnel du terme mais plutôt des programmes LOOP créés à partir de la syntaxe de base et dotés d'un mnémonique. Dans un sens formel, pour utiliser ces programmes, il faut soit (i) les "étendre" dans le code - ils nécessiteront l'utilisation de variables temporaires ou "auxiliaires" donc cela doit être pris en compte, ou (ii) concevoir le syntaxe avec les instructions « intégrées ».
- Exemple
La fonction de projection k-aire extrait la i-ième coordonnée d'un k-uplet ordonné.
Dans leur article fondateur, Meyer & Ritchie ont fait de la mission une déclaration de base. Comme le montre l'exemple, l'affectation peut être dérivée de la liste des instructions de base.
Pour créer l' instruction, utilisez le bloc de code ci-dessous. Observez l'utilisation de l'astuce mentionnée ci-dessus :
= équivalent
xj := 0; LOOP xi DO xj := xj + 1 END
Encore une fois, tout cela est pour plus de commodité seulement ; rien de tout cela n'augmente la puissance intrinsèque du modèle.
Exemples de programmes
Une addition
L'addition est définie récursivement comme :
Ici, S doit être lu comme "successeur".
Dans la séquence hyperopérateur, c'est la fonction
peut être implémenté par le programme LOOP ADD( x 1 , x 2 )
LOOP x1 DO x0 := x0 + 1 END; LOOP x2 DO x0 := x0 + 1 END
Multiplication
La multiplication est la fonction d'hyperopération
peut être implémenté par le programme LOOP MULT( x 1 , x 2 )
x0 := 0; LOOP x2 DO x0 := ADD( x1, x0) END
Le programme utilise le programme ADD() comme "instruction de commodité". Développé, le programme MULT est un programme LOOP avec deux instructions LOOP imbriquées. AJOUTER compte pour un.
Plus d'hyperopérateurs
Étant donné un programme LOOP pour une fonction d'hyperopération , on peut construire un programme LOOP pour le niveau suivant
par exemple (qui signifie exponentiation ) peut être implémenté par le programme LOOP POWER( x 1 , x 2 )
x0 := 1; LOOP x2 DO x0 := MULT( x1, x0 ) END
Le programme d'exponentiation, développé, comporte trois instructions LOOP imbriquées.
Prédécesseur
La fonction prédécesseur est définie comme
- .
Cette fonction peut être calculée par le programme LOOP suivant, qui définit la variable sur .
/* precondition: x2 = 0 */ LOOP x1 DO x0 := x2; x2 := x2 + 1 END
Élargi, c'est le programme
/* precondition: x2 = 0 */ LOOP x1 DO x0 := 0; LOOP x2 DO x0 := x0 + 1 END; x2 := x2 + 1 END
Ce programme peut être utilisé comme sous-programme dans d'autres programmes LOOP. La syntaxe LOOP peut être étendue avec l'instruction suivante, équivalente à l'appel ci-dessus en tant que sous-programme :
x0 := x1 ∸ 1
Remarque : Encore une fois, il faut faire attention aux effets secondaires. Le programme précédent modifie la variable x 2 , qui pourrait être utilisée ailleurs. Pour développer l'instruction x 0 := x 1 1, on pourrait initialiser les variables x n , x n+1 et x n+2 (pour un n assez grand) à 0, x 1 et 0 respectivement, exécutez le code sur ces variables et copiez le résultat (x n ) dans x 0 . Un compilateur peut le faire.
Soustraction de coupure
Si dans le programme « addition » au-dessus de la deuxième boucle décrémente x 0 au lieu d'incrémenter, le programme calcule la différence (coupée à 0) des variables et .
x0 := x1 LOOP x2 DO x0 := x0 ∸ 1 END
Comme auparavant, nous pouvons étendre la syntaxe LOOP avec l'instruction :
x0 := x1 ∸ x2
Si alors sinon
Une instruction if-then-else avec if x 1 > x 2 then P1 else P2 :
xn1 := x1 ∸ x2; xn2 := 0; xn3 := 1; LOOP xn1 DO xn2 := 1; xn3 := 0 END; LOOP xn2 DO P1 END; LOOP xn3 DO P2 END;
Voir également
Notes et références
Bibliographie
- Axt, Paul (1966). « Itération de récursivité primitive relative ». Mathematische Annalen . 167 : 53-55. doi : 10.1007/BF01361215 .
- Axt, Paul (1970). "Itération de récursivité primitive" . Journal de logique symbolique . 35 (3) : 479. doi : 10.1002/malq.19650110310 .
- Calude, Cristian (1988). Théories de la complexité computationnelle . Annales de Mathématiques Discrètes . 35 . Maison d'édition de Hollande du Nord . ISBN 9780080867755.
- Cherniavsky, John Charles (1976). "Des programmes simples réalisent exactement des formules Presburger". Revue SIAM sur l'informatique . 5 (4) : 666-677. doi : 10.1137/0205045 .
- Cherniavsky, John Charles; Kamin, Samuel Noah (1979). « Une axiomatique Hoare complète et cohérente pour un langage de programmation simple ». Association pour les machines informatiques . 26 (1) : 119-128. doi : 10.1145/322108.322120 .
- gendarme, Robert L.; Borodine, Allan B (1972). « Langages de programmation subrécursifs, partie I : Efficacité et structure du programme ». Journal de l'ACM . 19 (3) : 526-568. doi : 10.1145/321707.321721 .
- Crolard, Tristan ; Lacas, Samuel ; Valarcher, Pierre (2006). "Sur le pouvoir expressif du langage en boucle" . Journal nordique d'informatique . 13 : 46-57.
- Crolard, Tristan ; Polonowski, Emmanuel; Valarcher, Pierre (2009). « Extension du langage de boucle avec des variables procédurales d'ordre supérieur ». Transactions ACM sur la logique informatique . 10 (4).
- Enderton, Herbert (2012). Théorie de la calculabilité . Presse académique. doi : 10.1145/1555746.1555750 .
- Fachini, Emmanuela; Maggiolo-Schettini, Andrea (1979). "Une hiérarchie de fonctions de séquences récursives primitives" . RAIRO - Informatique Théorique - Informatique Théorique . 13 (1) : 49-67. doi : 10.1051/ita/1979130100491 .
- Fachini, Emmanuela; Maggiolo-Schettini, Andrea (1982). « Comparaison des hiérarchies de fonctions de séquence récursive primitives ». Zeitschrift für mathematische Logik und Grundlagen der Mathematik . 28 (27-32) : 431-445. doi : 10.1002/malq.19820282705 .
- Goetze, Bernhard; Nehrlich, Werner (1980). « La structure des programmes de boucle et des hiérarchies sous-récursives » . Zeitschrift für mathematische Logik und Grundlagen der Mathematik . 26 (14-18): 255-278. doi : 10.1002/malq.19800261407 .
- Ibarra, Oscar H. ; Leininger, Brian S. (1981). « Caractéristiques des fonctions de Presburger ». Revue SIAM sur l'informatique . 10 (1) : 22-39. doi : 10.1137/0210003 .
- Ibarra, Oscar H. ; Rosier, Louis E. (1983). " Langages de programmation simples et classes restreintes de machines de Turing " . Informatique théorique . 26 (1–2) : 197–220. doi : 10.1016/0304-3975(83)90085-3 .
- Kfoury, AJ; Moll, Robert N.; Arbib, Michael A. (1982). Une approche de programmation de la calculabilité . Springer, New York, NY. doi : 10.1007/978-1-4612-5749-3 . ISBN 978-1-4612-5751-6.
- Machtey, Michael (1972). "Langages à boucles augmentées et classes de fonctions calculables" . Journal des sciences de l'informatique et des systèmes . 6 (6) : 603-624. doi : 10.1016/S0022-0000(72)80032-1 .
- PlanèteMath. "fonction à valeur vectorielle récursive primitive" . Récupéré le 2021-08-21 .
- Matos, Armando B. (2014-11-03). « Forme fermée des fonctions récursives primitives : des programmes impératifs aux expressions mathématiques aux programmes fonctionnels » (PDF) . Récupéré 2021-08-20 .
- Matos, Armando B. (2015). « L'efficacité des fonctions récursives primitives : le point de vue d'un programmeur » . Informatique théorique . 594 : 65-81. doi : 10.1016/j.tcs.2015.04.022 .
- Meyer, Albert R. ; Ritchie, Dennis MacAlistair (1967). La complexité des programmes en boucle . ACM '67 : Actes de la 22e conférence nationale de 1967. doi : 10.1145/800196.806014 .
- Minsky, Marvin Lee (1967). Calcul : machines finies et infinies . Prentice Hall. doi : 10.1017/S0008439500029350 .
- Ritchie, Dennis MacAlistair (1967). Structure du programme et complexité de calcul (ébauche) (PDF) .
- Ritchie, Robert Wells (novembre 1965). "Classes de fonctions récursives basées sur la fonction d'Ackermann" . Journal Pacifique de Mathématiques . 15 (3) : 1027-1044. doi : 10.2140/pjm.1965.15.1027 .
- Schöning, Uwe (2001). Theoretische Informatik-kurz gefasst (4 éd.). Londres : Oxford University Press. ISBN 3-8274-1099-1.
- Schöning, Uwe (2008). Theoretische Informatik-kurz gefasst (5 éd.). Londres : Oxford University Press. ISBN 978-3-8274-1824-1. DNB 986529222 .
- Tsichritzis, Dennis C (1970). "Le problème d'équivalence des programmes simples". Journal de l'ACM . 17 (4) : 729-738. doi : 10.1145/321607.321621 .
- Tsichritzis, Dennis C (1971). « Une note sur la comparaison des hiérarchies subrécursives ». Lettres de traitement de l'information . 1 (2) : 42-44. doi : 10.1016/0020-0190(71)90002-0 .