LOOP (język programowania) - LOOP (programming language)
LOOP jest prostym językiem rejestru, który precyzyjnie wychwytuje prymitywne funkcje rekurencyjne . Język wywodzi się z modelu przeciw-maszyny . Podobnie jak liczniki, język LOOP zawiera zbiór jednego lub więcej nieograniczonych rejestrów , z których każdy może zawierać jedną nieujemną liczbę całkowitą. Kilka instrukcji arytmetycznych (takich jak 'Clear', 'INCrement', 'DECrement', 'CoPY', ...) działa na rejestrach. Jedyną instrukcją przepływu sterowania jest ' LOOP x DO ... END' . Powoduje to, że instrukcje w swoim zakresie są powtarzane x razy. (Zmiany zawartości rejestru x podczas wykonywania pętli nie wpływają na liczbę przejść.)
Historia
Język LOOP został sformułowany w artykule z 1967 roku przez Alberta R. Meyera i Dennisa M. Ritchiego . Wykazali oni zgodność między językiem LOOP a prymitywnymi funkcjami rekurencyjnymi .
Język był także tematem niepublikowanej pracy doktorskiej Ritchiego.
Zaprezentował ją również Uwe Schöning wraz z GOTO i WHILE .
Filozofia projektowania i funkcje
W przeciwieństwie do programów GOTO i programów WHILE, programy LOOP zawsze kończą się . Dlatego zbiór funkcji obliczanych przez programy LOOP jest właściwym podzbiorem funkcji obliczalnych (a zatem podzbiorem funkcji obliczalnych przez funkcje programu WHILE i GOTO).
Meyer i Ritchie udowodnili, że każda prymitywna funkcja rekurencyjna jest obliczalna w pętli i na odwrót.
Przykładem całkowitej obliczalnej funkcji, która nie jest obliczalna LOOP, jest funkcja Ackermanna .
Formalna definicja
Składnia
Pętlowych programów składa się z symboli LOOP
, DO
, END
, :=
, +
i ;
, jak również dowolną liczbę zmiennych i stałych. Programy LOOP mają następującą składnię w zmodyfikowanej postaci Backusa–Naura :
Tutaj są nazwy zmiennych i są stałymi.
Semantyka
Jeśli P jest programem LOOP, P jest odpowiednikiem funkcji . Zmienne through w programie LOOP odpowiadają argumentom funkcji i są inicjowane przed wykonaniem programu z odpowiednimi wartościami. Wszystkie inne zmienne mają początkową wartość zero. Zmienna odpowiada wartości, która przyjmuje wartości argumentów od do .
Oświadczenie o formie
xi := 0
oznacza, że wartość zmiennej jest ustawiona na 0.
Oświadczenie o formie
xi := xi + 1
oznacza, że wartość zmiennej jest zwiększana o 1.
Oświadczenie o formie
P1; P2
reprezentuje sekwencyjne wykonywanie podprogramów i , w tej kolejności.
Oświadczenie o formie
LOOP x DO P END
oznacza powtarzające się wykonanie częściowego programu w sumie razy, gdzie używana jest wartość, która ma na początku wykonania instrukcji. Nawet jeśli zmieni wartość , nie wpłynie to na to, ile razy zostanie wykonane w pętli. Jeśli ma wartość zero, to nie jest wykonywane wewnątrz instrukcji LOOP . Pozwala to na rozgałęzienia w programach LOOP, gdzie warunkowe wykonanie częściowego programu zależy od tego, czy zmienna ma wartość zero czy jeden.
Tworzenie „dogodnych instrukcji”
Z podstawowej składni tworzymy „wygodne instrukcje”. Nie będą to podprogramy w konwencjonalnym znaczeniu, ale raczej programy typu LOOP utworzone z podstawowej składni i opatrzone mnemonikiem. W sensie formalnym, aby korzystać z tych programów, należy albo (i) „rozszerzyć” je do kodu – będą wymagały użycia zmiennych tymczasowych lub „pomocniczych”, więc trzeba to wziąć pod uwagę, albo (ii) zaprojektować składnia z instrukcjami 'wbudowanymi'.
- Przykład
Funkcja projekcji k-ary wyodrębnia i-tą współrzędną z uporządkowanej k-krotki.
W swoim przełomowym artykule Meyer i Ritchie uczynili zadanie podstawowym stwierdzeniem. Jak pokazuje przykład, przypisanie można wyprowadzić z listy podstawowych stwierdzeń.
Aby utworzyć instrukcję, użyj poniższego bloku kodu. Zwróć uwagę na użycie powyższej wskazówki:
= ekwiwalent
xj := 0; LOOP xi DO xj := xj + 1 END
Ponownie, wszystko to jest tylko dla wygody; nic z tego nie zwiększa wewnętrznej mocy modelu.
Przykładowe programy
Dodatek
Dodawanie jest rekurencyjnie definiowane jako:
Tutaj S należy czytać jako „następca”.
W sekwencji hiperoperatora jest to funkcja
może być zaimplementowany przez program LOOP ADD( x 1 , x 2 )
LOOP x1 DO x0 := x0 + 1 END; LOOP x2 DO x0 := x0 + 1 END
Mnożenie
Mnożenie to funkcja hiperoperacji
może być realizowany przez program LOOP MULT( x 1 , x 2 )
x0 := 0; LOOP x2 DO x0 := ADD( x1, x0) END
Program używa programu ADD() jako "instrukcji wygodnej". Rozszerzony program MULT jest programem LOOP z dwoma zagnieżdżonymi instrukcjami LOOP. DODAJ liczy się za jeden.
Więcej hiperoperatorów
Mając program LOOP dla funkcji hiperoperacji , można skonstruować program LOOP dla następnego poziomu
na przykład (co oznacza potęgowanie ) można zaimplementować za pomocą programu LOOP POWER( x 1 , x 2 )
x0 := 1; LOOP x2 DO x0 := MULT( x1, x0 ) END
Rozszerzony program potęgowania ma trzy zagnieżdżone instrukcje LOOP.
Poprzednik
Poprzednia funkcja jest zdefiniowana jako
- .
Ta funkcja może być obliczona przez następujący program LOOP, który ustawia zmienną na .
/* precondition: x2 = 0 */ LOOP x1 DO x0 := x2; x2 := x2 + 1 END
Rozszerzony, to jest program
/* precondition: x2 = 0 */ LOOP x1 DO x0 := 0; LOOP x2 DO x0 := x0 + 1 END; x2 := x2 + 1 END
Ten program może być używany jako podprogram w innych programach LOOP. Składnia LOOP może być rozszerzona o następującą instrukcję, równoważną wywołaniu powyższego jako podprogramu:
x0 := x1 ∸ 1
Uwaga : Znowu trzeba pamiętać o efektach ubocznych. Poprzedni program zmienia zmienną x 2 , która może być używana gdzie indziej. Aby rozwinąć instrukcję x 0 := x 1 ∸ 1, można zainicjalizować zmienne x n , x n+1 i x n+2 (dla wystarczająco dużego n) odpowiednio na 0, x 1 i 0, uruchom kod na te zmienne i skopiuj wynik (x n ) do x 0 . Kompilator może to zrobić.
Odejmowanie odcięcia
Jeśli w programie „dodawanie” nad drugą pętlą zmniejsza się o x 0 zamiast zwiększać, program oblicza różnicę (odcięcie na 0) zmiennych i .
x0 := x1 LOOP x2 DO x0 := x0 ∸ 1 END
Tak jak wcześniej możemy rozszerzyć składnię LOOP o instrukcję:
x0 := x1 ∸ x2
Jeśli to inaczej
Instrukcja if-then-else z 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;
Zobacz też
Uwagi i referencje
Bibliografia
- Axt, Paweł (1966). „Iteracja względnej pierwotnej rekurencji”. Matematyka Annalen . 167 : 53–55. doi : 10.1007/BF01361215 .
- Axt, Paweł (1970). „Iteracja pierwotnej rekurencji” . Dziennik Logiki Symbolicznej . 35 (3): 479. doi : 10.1002/malq.19650110310 .
- Calude, Cristian (1988). Teorie złożoności obliczeniowej . Roczniki Matematyki Dyskretnej . 35 . Wydawnictwo North Holland . Numer ISBN 9780080867755.
- Czerniawski, Jan Karol (1976). „Proste programy realizują dokładnie formuły Presburgera”. SIAM Journal on Computing . 5 (4): 666–677. doi : 10.1137/0205045 .
- Czerniawski, Jan Karol; Kamin Samuel Noe (1979). „Kompletna i spójna Aksjomatyka Hoare dla prostego języka programowania”. Stowarzyszenie na rzecz Maszyn Komputerowych . 26 (1): 119–128. doi : 10.1145/322108.322120 .
- konstabl, Robert L.; Borodin, Allan B (1972). „Subrekursywne języki programowania, część I: Wydajność i struktura programu”. Dziennik ACM . 19 (3): 526-568. doi : 10.1145/321707.321721 .
- Crolard, Tristan; Lacas, Samuel; Valarcher, Pierre (2006). „O wyrazistej sile języka pętli” . Nordic Journal of Computing . 13 : 46–57.
- Crolard, Tristan; Polonowski, Emmanuel; Valarcher, Pierre (2009). „Rozszerzenie języka pętli o zmienne proceduralne wyższego rzędu”. Transakcje ACM w logice obliczeniowej . 10 (4).
- Enderton, Herbert (2012). Teoria obliczalności . Prasa akademicka. doi : 10.1145/1555746.1555750 .
- Fachini, Emanuela; Maggiolo-Schettini, Andrea (1979). „Hierarchia pierwotnych funkcji sekwencji rekurencyjnych” . RAIRO - Informatique Théorique - Informatyka teoretyczna . 13 (1): 49–67. doi : 10.1051/ita/1979130100491 .
- Fachini, Emanuela; Maggiolo-Schettini, Andrea (1982). „Porównanie hierarchii pierwotnych funkcji sekwencji rekurencyjnych”. Zeitschrift für mathematische Logik und Grundlagen der Mathematik . 28 (27–32): 431–445. doi : 10.1002/malq.19820282705 .
- Goetze, Bernharda; Nehrlich, Werner (1980). „Struktura programów pętlowych i hierarchie subrekurencyjne” . Zeitschrift für mathematische Logik und Grundlagen der Mathematik . 26 (14-18): 255-278. doi : 10.1002/malq.19800261407 .
- Ibarra, Oskar H.; Leininger, Brian S. (1981). „Charakterystyka funkcji Presburgera”. SIAM Journal on Computing . 10 (1): 22–39. doi : 10.1137/0210003 .
- Ibarra, Oskar H.; Rosier, Louis E. (1983). „Proste języki programowania i ograniczone klasy maszyn Turinga” . Informatyka teoretyczna . 26 (1–2): 197–220. doi : 10.1016/0304-3975(83)90085-3 .
- Kfoury, AJ; Moll, Robert N.; Arbib, Michael A. (1982). Programistyczne podejście do obliczalności . Springer, Nowy Jork, NY. doi : 10.1007/978-1-4612-5749-3 . Numer ISBN 978-1-4612-5751-6.
- Machtey, Michael (1972). „Języki z pętlą rozszerzoną i klasy funkcji obliczalnych” . Journal of Computer and System Sciences . 6 (6): 603–624. doi : 10.1016/S0022-0000(72)80032-1 .
- PlanetMath. „prymitywna rekurencyjna funkcja o wartościach wektorowych” . Pobrano 21.08.2021 .
- Matos, Armando B. (2014-11-03). „Zamknięta forma pierwotnych funkcji rekurencyjnych: od programów imperatywnych do wyrażeń matematycznych do programów funkcjonalnych” (PDF) . Pobrano 2021-08-20 .
- Matos, Armando B. (2015). "Wydajność prymitywnych funkcji rekurencyjnych: spojrzenie programisty" . Informatyka teoretyczna . 594 : 65-81. doi : 10.1016/j.tcs.2015.04.022 .
- Meyera, Alberta R .; Ritchie, Dennis MacAlistair (1967). Złożoność programów pętli . ACM '67: Materiały z 22. konferencji krajowej w 1967 r. doi : 10.1145/800196.806014 .
- Minsky, Marvin Lee (1967). Obliczenia: maszyny skończone i nieskończone . Sala Prezydencka. doi : 10.1017/S0008439500029350 .
- Ritchie, Dennis MacAlistair (1967). Struktura programu i złożoność obliczeniowa (szkic) (PDF) .
- Ritchie, Robert Wells (listopad 1965). "Klasy funkcji rekurencyjnych na podstawie funkcji Ackermanna" . Pacific Journal of Mathematics . 15 (3): 1027-1044. doi : 10.2140/pjm.1965.15.1027 .
- Schöninga, Uwe (2001). Theoretische Informatik-kurz gefasst (4 wyd.). Londyn: Oxford University Press. Numer ISBN 3-8274-1099-1.
- Schöninga, Uwe (2008). Theoretische Informatik-kurz gefasst (5 wyd.). Londyn: Oxford University Press. Numer ISBN 978-3-8274-1824-1. DNB 986529222 .
- Tsichritzis, Dennis C (1970). „Problem równoważności prostych programów”. Dziennik ACM . 17 (4): 729–738. doi : 10.1145/321607.321621 .
- Tsichritzis, Dennis C (1971). „Uwaga na porównanie subrekurencyjnych hierarchii”. Pisma dotyczące przetwarzania informacji . 1 (2): 42–44. doi : 10.1016/0020-0190(71)90002-0 .