Program WHILE

Program WHILE to jedno z narzędzi teorii obliczalności służące do ustanowienia, czy dana funkcja jest obliczalna.

Cechy

  • Klasa funkcji obliczalnych za pomocą WHILE odpowiada klasie funkcji obliczalnych za pomocą maszyny Turinga lub programów GOTO.
  • Programy WHILE bazują syntaktycznie i semantycznie, z wyjątkiem pętli WHILE, na programach LOOP.

Formalna definicja

Składnia

Programy WHILE składają się z symboli: WHILE, DO, END, +, -, :=, ;, {\displaystyle \neq } oraz dowolnej liczby zmiennych i stałych, przy czym stałe są elementami zbioru liczb naturalnych.

Program P jest syntaktycznie zdefiniowany w notacji BNF jako:

P ::= x i := x j + c | x i := x j c | P 1 ; P 2 | W H I L E x i 0 D O P E N D {\displaystyle {\begin{array}{lrl}P&::=&x_{i}:=x_{j}+c\\&|&x_{i}:=x_{j}-c\\&|&P_{1};P_{2}\\&|&\mathrm {WHILE} \,x_{i}\neq 0\,\mathrm {DO} \,P\,\mathrm {END} \end{array}}}

gdzie:

  • c {\displaystyle c} jest stałą,
  • x i , {\displaystyle x_{i},} x j {\displaystyle x_{j}} są zmiennymi
  • P 1 , {\displaystyle P_{1},} P 2 {\displaystyle P_{2}} to programy WHILE

Semantyka

Wszystkie użyte w danym programie zmienne zostają zainicjalizowane przed wykonaniem programu. Zmienne nie zainicjalizowane bezpośrednio otrzymują domyślną wartość 0.

Wyrażenie postaci

xi := xj + c

oznacza przyznanie zmiennej x i {\displaystyle x_{i}} wartości otrzymanej poprzez dodanie zmiennej x j {\displaystyle x_{j}} i stałej c . {\displaystyle c.} Specjalnym przypadkiem jest tutaj sytuacja, gdzie wartość stałej c {\displaystyle c} jest równa zeru. Wtedy wartość zmiennej x j {\displaystyle x_{j}} zostaje bezpośrednio przyznana zmiennej x i : {\displaystyle x_{i}{:}}

xi := xj + 0

Wyrażenie postaci

xi := xj – c

oznacza przyznanie zmiennej x i {\displaystyle x_{i}} wartości otrzymanej poprzez odjęcie stałej c {\displaystyle c} od zmiennej x j . {\displaystyle x_{j}.} w przypadku gdy wartość stałej jest wyższa niż wartość zmiennej wynikiem odejmowania jest 0.

Kompozycja dwóch programów WHILE ma postać


  
    
      
        
          P
          
            1
          
        
        ;
      
    
    {\displaystyle P_{1};}
  
 
  
    
      
        
          P
          
            2
          
        
      
    
    {\displaystyle P_{2}}
  

i oznacza, że program P 1 {\displaystyle P_{1}} zostanie wykonany przed programem P 2 . {\displaystyle P_{2}.}

Pętla WHILE ma postać

WHILE 
  
    
      
        
          x
          
            i
          
        
        
        0
      
    
    {\displaystyle x_{i}\neq 0}
  
 DO 
  
    
      
        P
      
    
    {\displaystyle P}
  
 END

przy czym liczba przebiegów programu, w przeciwieństwie do programów LOOP, nie jest z góry ustalona w zmiennej x i , {\displaystyle x_{i},} lecz może ulegać zmianom dynamicznie podczas wykonywania programu.

Przykładowa implementacja

Dodawanie

Następujący program WHILE przyznaje zmiennej x0 sumę zmiennych x1 i x2:

x0 := x1 + 0;
y := x2 + 0;
WHILE 
  
    
      
        y
        !
        =
        0
      
    
    {\displaystyle y!=0}
  
 DO
       
  
    
      
        y
        
          :
        
      
    
    {\displaystyle y{:}}
  
 = 
  
    
      
        y
        
        1
        ;
      
    
    {\displaystyle y-1;}
  

       
  
    
      
        
          x
          
            1
          
        
        
          :
        
      
    
    {\displaystyle x_{1}{:}}
  
 = 
  
    
      
        
          x
          
            1
          
        
      
    
    {\displaystyle x_{1}}
  
 + 1
END

Symulacja pętli WHILE za pomocą programu GOTO

Pętlę postaci

WHILE x 
  
    
      
        
      
    
    {\displaystyle \neq }
  
 0 DO P END

można przedstawić za pomocą następującego programu GOTO:

M1: IF x = 0 THEN GOTO M2;
    P;
    GOTO M1;
M2: ...

gdzie instrukcje za znacznikiem M2 są dowolne.

Zobacz też

  • program GOTO
  • program LOOP

Bibliografia

  • Uwe Schöning: Theoretische Informatik – kurzgefasst. Spektrum Akademischer Verlag. ISBN 3-8274-1099-1.