LOOP (linguaggio di programmazione) - LOOP (programming language)
LOOP è un semplice linguaggio di registro che cattura con precisione le funzioni ricorsive primitive . Il linguaggio è derivato dal modello della contromacchina . Come le macchine contatrici, il linguaggio LOOP comprende un insieme di uno o più registri illimitati , ognuno dei quali può contenere un singolo intero non negativo. Alcune istruzioni aritmetiche (come 'CleaR', 'INCrement', 'DECrement', 'CoPY', ...) operano sui registri. L'unica istruzione del flusso di controllo è ' LOOP x DO ... END' . Fa sì che le istruzioni all'interno del suo ambito vengano ripetute x volte. (Le modifiche al contenuto del registro x durante l'esecuzione del ciclo non influiscono sul numero di passaggi.)
Storia
Il linguaggio LOOP è stato formulato in un articolo del 1967 da Albert R. Meyer e Dennis M. Ritchie . Hanno mostrato la corrispondenza tra il linguaggio LOOP e le funzioni ricorsive primitive .
La lingua è stata anche l'argomento della tesi di dottorato inedita di Ritchie.
È stato presentato anche da Uwe Schöning , insieme a GOTO e WHILE .
Filosofia e caratteristiche del design
A differenza dei programmi GOTO e WHILE , i programmi LOOP terminano sempre . Pertanto, l'insieme delle funzioni calcolabili dai programmi LOOP è un sottoinsieme appropriato di funzioni calcolabili (e quindi un sottoinsieme delle funzioni calcolabili dai programmi WHILE e GOTO).
Meyer e Ritchie hanno dimostrato che ogni funzione ricorsiva primitiva è calcolabile con LOOP e viceversa.
Un esempio di una funzione calcolabile totale che non è calcolabile LOOP è la funzione di Ackermann .
Definizione formale
Sintassi
I programmi LOOP sono costituiti dai simboli LOOP, DO, END, :=, +e ;da qualsiasi numero di variabili e costanti. I programmi LOOP hanno la seguente sintassi nella forma Backus–Naur modificata :
Qui ci sono nomi di variabili e sono costanti.
Semantica
Se P è un programma LOOP, P è equivalente a una funzione . Le variabili passanti in un programma LOOP corrispondono agli argomenti della funzione e vengono inizializzate prima dell'esecuzione del programma con i valori appropriati. A tutte le altre variabili viene assegnato il valore iniziale zero. La variabile corrisponde al valore che assume quando vengono forniti i valori dell'argomento da a .
Una dichiarazione della forma
xi := 0
significa che il valore della variabile è impostato su 0.
Una dichiarazione della forma
xi := xi + 1
significa che il valore della variabile viene incrementato di 1.
Una dichiarazione della forma
P1; P2
rappresenta l'esecuzione sequenziale di sottoprogrammi e , in quest'ordine.
Una dichiarazione della forma
LOOP x DO P END
indica l'esecuzione ripetuta del programma parziale per un totale di volte, dove viene utilizzato il valore che ha all'inizio dell'esecuzione dell'istruzione. Anche se cambia il valore di , non influenzerà quante volte viene eseguito nel ciclo. Se ha valore zero, allora non viene eseguito all'interno dell'istruzione LOOP . Ciò consente diramazioni nei programmi LOOP, in cui l'esecuzione condizionale di un programma parziale dipende dal fatto che una variabile abbia valore zero o uno.
Creazione di "istruzioni pratiche"
Dalla sintassi di base si creano "istruzioni di convenienza". Queste non saranno subroutine nel senso convenzionale, ma piuttosto programmi LOOP creati dalla sintassi di base e dati un mnemonico. In senso formale, per utilizzare questi programmi è necessario (i) "espanderli" nel codice - richiederanno l'uso di variabili temporanee o "ausiliari", quindi questo deve essere preso in considerazione, o (ii) progettare il sintassi con le istruzioni 'integrato'.
- Esempio
La funzione di proiezione k-ary estrae la coordinata i-esima da una k-upla ordinata.
Nel loro articolo fondamentale, Meyer & Ritchie hanno fatto dell'incarico una dichiarazione di base. Come mostra l'esempio, l'assegnazione può essere derivata dall'elenco delle istruzioni di base.
Per creare l' istruzione utilizzare il blocco di codice sottostante. Osservare l'uso del suggerimento sopra menzionato:
= equiv
xj := 0; LOOP xi DO xj := xj + 1 END
Ancora una volta, tutto questo è solo per comodità; niente di tutto questo aumenta il potere intrinseco del modello.
Programmi di esempio
aggiunta
L'addizione è definita ricorsivamente come:
Qui, S dovrebbe essere letto come "successore".
Nella sequenza dell'iperoperatore è la funzione
può essere implementato dal programma LOOP ADD( x 1 , x 2 )
LOOP x1 DO x0 := x0 + 1 END; LOOP x2 DO x0 := x0 + 1 END
Moltiplicazione
La moltiplicazione è la funzione di iperoperazione
può essere implementato dal programma LOOP MULT( x 1 , x 2 )
x0 := 0; LOOP x2 DO x0 := ADD( x1, x0) END
Il programma utilizza il programma ADD() come "istruzione di convenienza". Espanso, il programma MULT è un programma LOOP con due istruzioni LOOP annidate. AGGIUNGI conta per uno.
Più iperoperatori
Dato un programma LOOP per una funzione di iperoperazione , si può costruire un programma LOOP per il livello successivo
ad esempio (che sta per elevamento a potenza ) può essere implementato dal programma LOOP POWER( x 1 , x 2 )
x0 := 1; LOOP x2 DO x0 := MULT( x1, x0 ) END
Il programma di elevazione a potenza, espanso, ha tre istruzioni LOOP nidificate.
Predecessore
La funzione predecessore è definita come
- .
Questa funzione può essere calcolata dal seguente programma LOOP, che imposta la variabile su .
/* precondition: x2 = 0 */ LOOP x1 DO x0 := x2; x2 := x2 + 1 END
Ampliato, questo è il programma
/* precondition: x2 = 0 */
LOOP x1 DO
x0 := 0;
LOOP x2 DO
x0 := x0 + 1
END;
x2 := x2 + 1
END
Questo programma può essere utilizzato come subroutine in altri programmi LOOP. La sintassi LOOP può essere estesa con la seguente istruzione, equivalente a chiamare quanto sopra come subroutine:
x0 := x1 ∸ 1
Osservazione : Ancora una volta bisogna pensare agli effetti collaterali. Il programma predecessore modifica la variabile x 2 , che potrebbe essere utilizzata altrove. Per espandere l'istruzione x 0 := x 1 ∸ 1, si potrebbero inizializzare le variabili x n , x n+1 e x n+2 (per un n abbastanza grande) rispettivamente a 0, x 1 e 0, eseguire il codice su queste variabili e copia il risultato (x n ) in x 0 . Un compilatore può farlo.
Sottrazione di cut-off
Se nel programma 'addizione' sopra il secondo ciclo decrementa x 0 invece di incrementare, il programma calcola la differenza (taglia a 0) delle variabili e .
x0 := x1 LOOP x2 DO x0 := x0 ∸ 1 END
Come prima, possiamo estendere la sintassi LOOP con l'istruzione:
x0 := x1 ∸ x2
Se poi altro
Un'istruzione if-then-else con 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;
Guarda anche
Note e riferimenti
Bibliografia
- Axt, Paul (1966). "Iterazione della ricorsione primitiva relativa". Mathematische Annalen . 167 : 53-55. doi : 10.1007/BF01361215 .
- Axt, Paul (1970). "Iterazione della ricorsione primitiva" . Giornale di logica simbolica . 35 (3): 479. doi : 10.1002/malq.19650110310 .
- Calude, Cristian (1988). Teorie della complessità computazionale . Annali di matematica discreta . 35 . Casa editrice dell'Olanda settentrionale . ISBN 9780080867755.
- Cherniavsky, John Charles (1976). "I programmi semplici realizzano esattamente le formule di Presburger". SIAM Journal on Computing . 5 (4): 666–677. doi : 10.1137/0205045 .
- Cherniavsky, John Charles; Kamin, Samuel Noè (1979). "Un'assiomatica Hoare completa e coerente per un linguaggio di programmazione semplice". Associazione per le macchine informatiche . 26 (1): 119-128. doi : 10.1145/322108.322120 .
- Conestabile, Robert L.; Borodin, Allan B (1972). "Linguaggi di programmazione subcorsiva, parte I: Efficienza e struttura del programma". Giornale dell'ACM . 19 (3): 526-568. doi : 10.1145/321707.321721 .
- Crolard, Tristano; Lacas, Samuele; Valarcher, Pierre (2006). "Sulla potenza espressiva del linguaggio loop" . Giornale nordico di informatica . 13 : 46-57.
- Crolard, Tristano; Polonowski, Emmanuel; Valarcher, Pierre (2009). "Estensione del linguaggio loop con variabili procedurali di ordine superiore". Transazioni ACM su logica computazionale . 10 (4).
- Enderton, Herbert (2012). Teoria della calcolabilità . stampa accademica. doi : 10.1145/1555746.1555750 .
- Fachini, Emanuela; Maggiolo Schettini, Andrea (1979). "Una gerarchia di funzioni di sequenza ricorsive primitive" . RAIRO - Informatique Théorique - Informatica teorica . 13 (1): 49-67. doi : 10.1051/ita/1979130100491 .
- Fachini, Emanuela; Maggiolo Schettini, Andrea (1982). "Confronto tra gerarchie di funzioni di sequenza ricorsive primitive". 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 struttura dei programmi di loop e le gerarchie subricorsive" . 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). "Caratterizzazioni delle funzioni di Presburger". SIAM Journal on Computing . 10 (1): 22-39. doi : 10.1137/0210003 .
- Ibarra, Oscar H.; Rosier, Louis E. (1983). "Linguaggi di programmazione semplici e classi ristrette di macchine di Turing" . Informatica teorica . 26 (1–2): 197–220. doi : 10.1016/0304-3975(83)90085-3 .
- Kfoury, AJ; Moll, Robert N.; Arbib, Michael A. (1982). Un approccio di programmazione alla calcolabilità . Springer, New York, NY. doi : 10.1007/978-1-4612-5749-3 . ISBN 978-1-4612-5751-6.
- Machtey, Michael (1972). "Linguaggi ad anello aumentato e classi di funzioni calcolabili" . Giornale di scienze informatiche e di sistema . 6 (6): 603–624. doi : 10.1016/S0022-0000(72)80032-1 .
- PlanetMath. "funzione a valori vettoriali ricorsiva primitiva" . Estratto 2021-08-21 .
- Matos, Armando B. (2014-11-03). "Forma chiusa di funzioni ricorsive primitive: dai programmi imperativi alle espressioni matematiche ai programmi funzionali" (PDF) . Estratto 2021-08-20 .
- Matos, Armando B. (2015). "L'efficienza delle funzioni ricorsive primitive: il punto di vista di un programmatore" . Informatica teorica . 594 : 65–81. doi : 10.1016/j.tcs.2015.04.022 .
- Meyer, Albert R .; Ritchie, Dennis Mac Alistair (1967). La complessità dei programmi loop . ACM '67: Atti del XXII convegno nazionale del 1967. doi : 10.1145/800196.806014 .
- Minsky, Marvin Lee (1967). Calcolo: macchine finite e infinite . Prentice Hall. doi : 10.1017/S0008439500029350 .
- Ritchie, Dennis Mac Alistair (1967). Struttura del programma e complessità computazionale (bozza) (PDF) .
- Ritchie, Robert Wells (novembre 1965). "Classi di funzioni ricorsive basate sulla funzione di Ackermann" . Pacific Journal of Mathematics . 15 (3): 1027–1044. doi : 10.2140/pjm.1965.15.1027 .
- Schöning, Uwe (2001). Theoretische Informatik-kurz gefasst (4 ed.). Londra: Oxford University Press. ISBN 3-8274-1099-1.
- Schöning, Uwe (2008). Theoretische Informatik-kurz gefasst (5 ed.). Londra: Oxford University Press. ISBN 978-3-8274-1824-1. DNB 986529222 .
- Tsichritzis, Dennis C (1970). "Il problema dell'equivalenza dei programmi semplici". Giornale dell'ACM . 17 (4): 729-738. doi : 10.1145/321607.321621 .
- Tsichritzis, Dennis C (1971). "Una nota sul confronto delle gerarchie subricorsive". Lettere per il trattamento delle informazioni . 1 (2): 42–44. doi : 10.1016/0020-0190(71)90002-0 .