14 votos

¿"Opuesto" a la operación idempotente?

¿Qué adjetivo recibe una operación/expresión matemática sobre una variable cuyo nuevo valor sólo puede describirse en función del valor existente de dicha variable? ¿Operación secuencial?

  • Ejemplo: i = i + 1
  • Contraejemplo: i = 3 + 1

No sé si lo que yo llamo "operación secuencial" es semánticamente opuesto a operación/expresión "idempotente", pero lo parece (por ejemplo, el contador-ejemplo mostrado no cambia de valor dependiendo de cuántas veces lo ejecutes).

Por qué pregunto Estoy intentando distinguir entre las funciones de mi programa informático en las que es necesario leer el valor existente en memoria antes de poder calcular el valor de las que pueden expresarse como literales simples. Necesito declarar en mi documento de diseño que mi programa debe soportar ambos casos, y quiero usar el término matemáticamente correcto para ello. (nótese que no necesita ser numérico, podría ser concatenación de cadenas vs sobrescritura de cadenas).

2 votos

¿Recursivo? ¿Implícito?

0 votos

Ambas me parecen correctas en función de mis definiciones de esos términos y de cómo he formulado la pregunta. No estoy tan seguro de si evocan el significado deseado en la descripción de mi programa informático. Pero marcaré la pregunta como correcta si la publicas como respuesta.

0 votos

No tengo ningún problema en esperar a ver si surge algo más útil en el debate.

15voto

RJ Cuthbertson Puntos 131

Sé que esta pregunta es de hace más de un año, pero para la posteridad, el término correcto para "lo contrario de idempotente" (al menos en informática) es no idempotente .

Por ejemplo, véase la sección 9.1.2 de Protocolo de transferencia de hipertexto -- HTTP/1.1 (RFC 2616) :

9.1.2 Métodos idempotentes

Los métodos también pueden tener la propiedad de "idempotencia" en el sentido de que (aparte de de problemas de error o caducidad) los efectos secundarios de N > 0 idéntico idénticas son los mismos que los de una única solicitud. Los métodos GET, HEAD, PUT y DELETE comparten esta propiedad. Además, los métodos OPTIONS y TRACE NO DEBERÍAN tener efectos secundarios, por lo que son inherentemente idempotentes.

Sin embargo, es posible que una secuencia de varias peticiones no sea idempotente, aunque todos los métodos ejecutados en esa secuencia sean idempotentes. (Una secuencia es idempotente si secuencia completa siempre produce un reejecución de toda, o parte, de esa secuencia). Por ejemplo, una secuencia secuencia es no idempotente si su resultado depende de un valor que se modificado posteriormente en la misma secuencia.

Una secuencia que nunca tiene efectos secundarios es idempotente, por definición (siempre que no se estén ejecutando operaciones concurrentes sobre el mismo conjunto de recursos).

El énfasis es mío.

10voto

Dewayne Coe Puntos 11

Creo que tienes una idea inválida de qué idempotente realmente significa . No importa si el resultado de la operación está relacionado con el valor actual de una variable. Te daré algunos ejemplos:

  • $i = 3 + 1$ es seguramente idempotente, mientras que

  • $i = i + 1$ seguramente no lo es. Sin embargo:

  • $i = i + 0$ es idempotente, aunque el nuevo valor se calcule a partir del valor actual. Lo mismo ocurre con:

  • $i = i * 1$ que también es idempotente. Sin embargo:

  • $i = rand(0, 1)$ es no-idempotente, aunque no se relacione con su valor anterior.

En resumen, decimos que el una operación es idempotente cuando al ejecutarla varias veces se obtiene exactamente el mismo resultado que al ejecutarla exactamente una vez .

Respondiendo a la pregunta planteada en el tema de este hilo, existen dos términos contrapuestos:

  • Una operación es nula, cuando al realizarla cualquier número de veces tiene el mismo resultado que realizarla cero veces.
  • Una operación es no idempotente, cuando al realizarla varias veces no se obtiene necesariamente el mismo resultado cada vez que se realiza.

Permítanme proporcionar otro ejemplo, ampliando el ejemplo que RJ Cuthbertson proporcionó. El ejemplo de RJ muestra cómo funcionan los métodos HTTP desde la perspectiva del cliente de un servicio. Sin embargo, echemos un vistazo al modelo interno del servicio:

  • El método GET es nulo . Funcionamiento de En un recurso es consulta pura y no tiene impacto en el modelo interno.
  • El método PUT es idempotente . Funcionamiento de poniendo un recurso permite al usuario designar la ubicación exacta en la que debe estar disponible. Colocar el mismo recurso en la misma ubicación varias veces produce el mismo estado interno del sistema que publicarlo exactamente una vez.
  • El método POST no es idempotente . Al publicar un recurso, el servidor decide la ubicación en la que debe estar disponible. Si se publica el mismo recurso varias veces, estará disponible en varias ubicaciones.

Eso sí, se trata de una pura abstracción. El programador puede implementar cualquiera de estos métodos para hacer lo que quiera. Esta es la forma en que esperamos que se comporte, sin embargo.

6voto

vonbrand Puntos 15673

"Idempotente" significa que repetir la operación no cambia el resultado. Eso no significa que no haga cambios. Por ejemplo, asignar es idempotente (asignar 10 cinco veces seguidas, el resultado siempre será 10); incrementar no lo es (haciendo i++ una o dos veces en C da resultados diferentes). ¿Quizás te refieres a que no tiene efectos secundarios, o a que es una función "pura" (cada vez que la llamas con los mismos argumentos, el valor devuelto es el mismo)? Tenga en cuenta que, por ejemplo $\sin x$ es puro en este sentido (cada vez que pides $\sin 1$ obtendrá el mismo resultado), funciones como printf(3) o malloc(3) en C no lo son.

0 votos

Interesante - "función pura" es probablemente el término matemático que estoy rondando sin saberlo. La única pregunta que me queda es: ¿cómo llamaría al lado derecho de una función pura? ¿Una expresión pura? ¿Cómo escribiría esta frase (está relacionada con actualizaciones de bases de datos)? "Si estás asignando una expresión pura a la celda, llama al métodoA(). Si estás asignando una expresión impura a la celda, llama al métodoB()".

0 votos

Alego ignorancia... pregunte a un par de personas en las bases de datos, quizás consulte en DBA.stackexchange.com o stackoverflow.com ?

1 votos

Sólo para aclarar que incluso "función pura" en un sentido de programación C podría no ser lo que quieres, ya que una función pura se le permite examinar la memoria global y, en consecuencia, el resultado puede ser diferente cada vez que se llama, en cambio una "función const" no tiene ningún efecto que no sea su resultado, y no puede acceder a la memoria global, c.f. el manual de GCC sobre los atributos de función: gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X