UL/FRI/VSP-RI/OAPS2/HitriZapiski/2006-05-25 B-D

Iz E-študij, proste zakladnice študentskega znanja

< UL | FRI | VSP-RI | OAPS2
Skoči na: navigacija, iskanje
  • Parcialna pravilnost
  • Totalna pravilnost
  • Primeri dokazov

Vsebina

Parcialna pravilnost

Zančna invarianta

if()                   P1(y)   P2(y)
 { }  //P1(y);           |       |
else                     |<------'
 { }  //P2 (y);          |
//P1(Y) v P2(Y)        P1(y)||P2(y)

Če nam dokazovnje uspe z zančno invarianto smo dokazali pravilnost programa.

Totalna pravilnost

Problematične so zanke.

  • Za vsako zanko v programu definiramo zančno spremenljivko l (naravno število, ki se zmanjšuje ob vsaki iteraciji)
  • Potrebujemo dobro utemeljeno množico D
utemeljena množica je množica, ki je delno urejena in nima neskončnih padajočih zaporedij
  • l in D morata biti tako defnirani da lahko definiramo še zančno invarianto:
\! l \in D
l pred izvajanjem
ll po izvajanju
l > ll

\! D = \mathbb{N}_0

Primeri

Izračun faktoriele

static public int faks(int n) {
  int i=0; //stevec
  int f=1; //vrednost faktoriele 
  while (i<n) {
    i++;  //povečamo števec
    f*=i; //množimo s prejšnjo vrednostjo
  }
  return f; //vrnemo rezultat
}

Postavimo zančno invarianto (označeno z I), ki velja v točkah označenih z *:

     \!\alpha
     |    \! \Phi(n) = (n \in \mathbb{N}_0)
   i <- 0
     |
     | i=0
     |
     *
     |
     | f=1 && i=0 => [f=i!]
     |
     |<------*------------------------.  f/i = (i-1)!
     *                                |  f= i×(i-1)! = i! && (i ≤ n)
     |                                |
   f <- 1                             |
     |       yes                      |
     |                                |
     |       .-(f=i!)&&(i<n)   .-(f=(i-1)!)&&(i-1<n) = i ≤ 0
     |       |                 |      |
   [i < n]---*----  i <- i+1  --- f <- f*i
     |
     * no
     |
     | f=n! => f=i!
     | \! (f=i!)\land(i \ge n)\land(i \le n) \Rightarrow i = n \Rightarrow f=n!
     |
   faks<- f
     |    \! \Psi(faks,n) = (faks = n!)
     \! \epsilon

\! I = (f = i!) \land (i \le n)

\! D = \mathbb{N}_0

zančna spremenljivka

\! l=n-i

zančna invarianta

\! l \in \mathbb{N}_0
static public int faks(int n) {
  int i=0; //stevec
  int f=1; //vrednost faktoriele
  \! n \in \mathbb{N}_0 \land i = 0 \Rightarrow n - i \in \mathbb{N}_0 
  while (i<n) {
    \! n - i \in \mathbb{N}_0 \land i<n
    i++;  //povečamo števec
    f*=i; //množimo s prejšnjo vrednostjo
    \! ( n - (i-1) \in \mathbb{N}_0 \land (( i-1) < n) \Rightarrow n - i \Rightarrow i \le n \Rightarrow n - i \in \mathbb{N}_0
  }
  \! n - i \in \mathbb{N}_0
  return f; //vrnemo rezultat
}

Množenje z inkrementom

\! \Phi (x,y) = (x,y \in \mathbb{N}_0)

\! \Psi (prod, x, y) = (prod = x \cdot y)

static public int prod (int x, int y) {
  <math>\! \Phi (x,y) = (x,y \in \mathbb{N}_0)</math>
  int i,j,p; //stevca, vmesni rezultat
  i = 0;
  p = 0; //init
  while ( i! = x ) {
    while ( j! = y ) {
      p++;
      j++;
    }
    i++;
  }
  return p;
  <math>\! \Psi (prod, x, y) = (prod = x \cdot y)</math>
}



   \!\alpha  
   |
 i <- 0   
   |      
 f <- 0   
   |
   *  \!I_1 \Rightarrow i = 0 \land p=0
   | 
   |<-----*---------------------------------------------------.
   |                        .--------*---------------.        |
   |                        |                        |        |
   |                        |                     j <- j+1    |
   |   yes                  v             yes        |        |
 i ≠ 0 --*-------  j<-0 --*---*-- j ≠ y ---*----  p <- p+1    |
   |                                |                         |
   * no  p=i×j                      * no                      |
   |                                |                         |
  prod<-p                           `------------ i<-i+1 -----´
   |
   | prod = x×y
   \! \epsilon   

\! I_2 = ( p = i \cdot y + j )


FRI VSP OAPS2 HitriZapiski 2006-05-25 1.png


\! l_1 = x - i \in \mathbb{N}_0 (notranja zanka)

\! l_2 = y-j \in \mathbb{N}_0 (zunanja zanka)


\! \Phi ( n, x_1, ..., x_n) = (n \in \mathbb{N} ) \land (X_i \in R)

\! \Psi ( mm, n, x_1, ... , x_n) = ( mm = max_{i=1}^n x_i

750px

l = n-i+1 \in \mathbb{N}_0

Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja