language-agnostic - traduccion - invariant js
¿Qué es un invariante? (8)
Algo que no cambia dentro de un bloque de código
La palabra parece usarse en varios contextos. Lo mejor que puedo entender es que se refieren a una variable que no puede cambiar. ¿No es eso para lo que son las constantes / finales (maldito Java!)?
Como dice esta línea:
En ciencias de la computación, un predicado que, si es verdadero, seguirá siendo verdadero a lo largo de una secuencia específica de operaciones, se denomina (an) invariante a esa secuencia.
Para comprender mejor esta esperanza, este ejemplo en C ++ ayuda.
Considere un escenario en el que debe obtener algunos valores y obtener el recuento total de ellos en una variable llamada como count
y agregarlos en una variable llamada sum
El invariante (de nuevo es más como un concepto):
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
El código para lo anterior sería algo como esto,
int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}
¿Qué hace el código anterior?
1) Lee la entrada de cin
y los pone en x
2) Después de una lectura exitosa, count
incrementos y sum = sum + x
3) Repita 1-2 hasta que se detenga la lectura (es decir, ctrl + D)
Loop invariante:
El invariante debe ser verdadero SIEMPRE . Entonces inicialmente comienzas tu código con solo esto
while(cin>>x){
}
Este ciclo lee datos de la entrada estándar y almacena en x. Bien y bueno. Pero el invariante se vuelve falso porque la primera parte de nuestro invariante no se siguió (o se mantuvo).
// we have read count grades so far, and
¿Cómo mantener lo invariante cierto?
¡Sencillo! recuento de incrementos
Así que ++count;
haría bien !. Ahora nuestro código se convierte en algo como esto,
while(cin>>x){
++count;
}
Pero
Incluso ahora nuestro invariante (un concepto que debe ser VERDADERO) es falso porque ahora no satisfacemos la segunda parte de nuestro invariante.
// sum is the sum of the first count grades
Entonces, ¿qué hacer ahora?
Suma x
a la sum
y almacénala en sum
( sum+=x
) y la próxima vez cin>>x
leerá un nuevo valor en x.
Ahora nuestro código se convierte en algo como esto,
while(cin>>x){
++count;
sum+=x;
}
Vamos a revisar
Si el código coincide con nuestro invariante
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
código:
while(cin>>x){
++count;
sum+=x;
}
Ah !. Ahora el bucle invariante es True siempre y el código funciona bien.
El ejemplo anterior fue tomado y modificado del libro Acelerado C ++ por Andrew-koening y Barbara-E
El invariante ADT especifica las relaciones entre los campos de datos (variables de instancia) que siempre deben ser verdaderas antes y después de la ejecución de cualquier método de instancia.
Es una condición que usted sabe que siempre es cierta en un lugar particular de su lógica y puede verificar cuando se realiza la depuración para resolver lo que salió mal.
La magia de wikipedia: Invariant (informática)
En ciencias de la computación, un predicado que, si es verdadero, seguirá siendo verdadero a lo largo de una secuencia específica de operaciones, se denomina (an) invariante a esa secuencia.
Normalmente los veo más en términos de algoritmos o estructuras.
Por ejemplo, podría tener un bucle invariante que podría afirmarse, siempre verdadero al comienzo o al final de cada iteración. Es decir, si su bucle supuestamente procesara una colección de objetos de una pila a otra, podría decir que | stack1 | + | stack2 | = c, en la parte superior o inferior del bucle.
Si la verificación invariante falla, indicaría que algo salió mal. En este ejemplo, podría significar que olvidó insertar el elemento procesado en la pila final, etc.
Siguiendo con lo que es, los invariantes son bastante útiles para escribir código limpio, ya que saber conceptualmente qué invariantes deberían estar presentes en su código le permite decidir fácilmente cómo organizar su código para alcanzar esos objetivos. Como se mencionó antes, también son útiles en la depuración, ya que verificar si el invariante se mantiene es a menudo una buena forma de ver si la manipulación que estás intentando realizar realmente está haciendo lo que deseas.
Un invariante es más "conceptual" que una variable. En general, es una propiedad del estado del programa que siempre es verdad. Se dice que una función o método que asegura que se mantiene el invariante mantiene el invariante.
Por ejemplo, un árbol de búsqueda binaria puede tener la invariante de que para cada nodo, la clave del hijo izquierdo del nodo es menor que la propia clave del nodo. Una función de inserción correctamente escrita para este árbol mantendrá ese invariante.
Como puede ver, ese no es el tipo de cosas que puede almacenar en una variable: es más una afirmación sobre el programa. Al descubrir qué tipo de invariantes debe mantener su programa, luego de revisar su código para asegurarse de que realmente mantiene esas invariantes, puede evitar errores lógicos en su código.