2017-05-19 6 views

Répondre

0

Il y a quelques problèmes ici. D'abord, votre boucle interne n'est pas correcte, car la variable temp n'est jamais mise à jour. Je recommande de supprimer temp et d'utiliser la condition de boucle down >= 0 && a[down+1] < a[down] à la place. Deuxièmement, vous avez plusieurs problèmes avec l'invariant de la boucle interne qui est mal formé (index hors plage, violation de la condition préalable sorted). Cependant, au lieu de les corriger, je recommande de jeter les deux invariants de la boucle interne et d'essayer à nouveau.

Mon invariant préféré pour le type de boucle d'insertion interne est "a[0..up+1] est trié sauf éventuellement à down + 1". Vous pouvez l'indiquer comme

invariant forall j,k | 0 <= j < k < up+1 && k != down+1 :: a[j]<=a[k] 

Le fichier résultant vérifie.