Nous savons qu'une variante de boucle est définie comme une déclaration qui est vraie avant et après chaque itération de la boucle. Mais cette définition est-elle trop vague? Regardons un exemple concret: la recherche linéaire.Comment définit-on un invariant de boucle?
entrée: Une séquence de n nombres A = (a 1 , un , un , ..., a n ) et une valeur v
sortie: un index i tel que v = a [i] ou NIL si v ne se trouve pas dans une
Voici mon pseudo:
linear_search(A, v)
1 for i ∈ {1, 2, ..., n}
2 if A[i] = v
3 return i
4 return NIL
donc typique invariant de boucle serait que (puisque nous cherchons de gauche à droite) v n'est pas sur le côté gauche de l'index actuel, ou mathématiquement, P: ∀p ∈ {1, 2, ..., i - 1}, A[p] ≠ v.
Ceci est clairement vrai, même au début, car p ∈ Ø est faux, ce qui rend P vrai, en se rappelant que toute déclaration universellement quantifiée peut être considérée comme une déclaration conditionnelle. (Mais il est plus facile d'y penser de façon informelle: au début, il n'y a rien du côté gauche de v.)
Nous pourrions également utiliser une instruction conditionnelle moins restrictive. Dans ce cas, Q: If A[i] = v, then 1 ≤ i ≤ n.
Évidemment, ceci est vrai si v est trouvé. Si v n'est pas trouvé, A [i] = v est faux et Q devient vrai quelle que soit la valeur de i. Q est également vrai si nous changeons notre algorithme pour effectuer une recherche de droite à gauche. Peut-être que nous voulons être moins restrictifs que cela. Qu'en est-il de l'utilisation d'une déclaration qui est toujours vraie? R: Either A[i] = v or A[i] ≠ v.
R tient avant et après chaque itération de la boucle.
Lesquelles des instructions P, Q et R sont valables pour être utilisées comme invariant de boucle?
Un invariant de boucle devrait être une propriété 'utile' de la boucle elle-même. Votre propriété R est plus d'une tautologie quelle que soit la boucle. Ainsi, seuls IM et Q peuvent être considérés comme des invariants de boucle, bien que Q soit plus faible. –
Je recommande fortement David Gries, La science de la programmation, qui donne un développement méthodique de ce sujet et bien plus encore. – Gene
une copie possible de - http://stackoverflow.com/questions/3221577/what-is-a-loop-invariant –