4

Dies ist der Algorithmus:Wie kann ich beweisen, dass dieser binäre Suchalgorithmus korrekt ist, indem er die Logik verwendet?

// Precondition: n > 0 

l = -1; 
r = n; 

while (l+1 != r) { 
    m = (l+r)/2; 

    // I && m == (l+r)/2 

    if (a[m] <= x) { 
     l = m; 
    } else { 
     r = m; 
    } 
} 
// Postcondition: -1 <= l < n 

ich einige der Forschung getan haben und verengte die invariante bis if x is in a[0 .. n-1] then a[l] <= x < a[r].

Ich habe keine Ahnung, wie man von dort aber weiterkommt. Die Voraussetzung scheint zu groß zu sein, so dass ich Probleme habe, diese P -> I zu zeigen.

Jede Hilfe wird sehr geschätzt. Dies sind die logischen Regeln, die verwendet werden können, um die Korrektheit des Algorithmus zu beweisen:

Logic rule for conditionals

Logic rule for loops

+0

Post-Zustand des 'while' Schleife die Umkehrung seiner Fortsetzungsbedingung ist, so in Ihrem Fall ist es'! (L + 1! = R) ', dh' l + 1 == r'. – dasblinkenlight

Antwort

1

Die Invariante ist

-1 <= l and l + 1 < r <= n and a[l] <= x < a[r] 

mit der impliziten Konvention a[-1] = -∞, a[n] = +∞.

Dann in der Anweisung if

a[l] <= x < a[r] and a[m] <= x implies a[m] <= x < a[r] 

und

a[l] <= x < a[r] and x < a[m] implies a[l] <= x < a[m]. 

In jedem Fall stellt die Zuordnung a[l] <= x < a[r].

Gleichzeitig stellt -1 <= l and l + 1 < r <= n-1 < m < n sicher, so dass die Auswertung von a[m] möglich ist.

Nach Beendigung l + 1 = r und durch den unveränderlichen

-1 <= l < n and a[l] <= x < a[l + 1]. 
+0

Aber gemäß den logischen Regeln von hoare muss ich zuerst beweisen, dass die Vorbedingung die Invariante impliziert. Wie könnte ich das tun? – marcospgp

+1

Precond 'n> 0' und dann zwei erste Zuweisungen' l = -1; r = n 'führt zu' 1 = -1 'und' r = n> 0 ', dann bedeutet es offensichtlich' 1> = - 1 'und' 1 + 1

+1

@marcospgp: Ja, das ist quasi-trivial: sicherlich '-∞ <= x <+ ∞'. –

Verwandte Themen