¿Es posible calcular si dos funciones son extensionales iguales?


9

Si tiene dos funciones que implementan un algoritmo de clasificación diferente, ¿es posible inferir por código fuente que ambas tienen las mismas propiedades externas? ¿Significa que ambos tendrán una posible secuencia sin clasificar como entrada y tendrán una secuencia ordenada como salida? ¿De qué manera el código fuente podría determinar estas propiedades externas? ¿Y cómo describirías estas propiedades externas? ¿Qué notación se usaría?

Las propiedades externas podrían darse a conocer definiéndolas explícitamente, por ejemplo dentro de un sistema de tipos, pero me pregunto si esto podría hacerse implícitamente. ¿O es de alguna manera teóricamente imposible inferir este tipo de semántica? Estoy interesado en saber si esto es posible para funciones arbitrarias, no solo para ordenar algoritmos, asumiendo que cosas como las funciones siempre se detendrán y no tendrán efectos secundarios.

¿Debo mirar la semántica denotacional o no está relacionada?

Me interesan los indicadores para investigar en esta área y los diferentes términos utilizados para describir el tema que podrían ayudar a mi búsqueda de literatura.

Respuestas:


8

Si. Si puede verificar que son iguales, entonces también puede hacerlo una computadora.

Aquí hay una especificación rápida para una ordenación de enteros en Coq:

Inductive natlist : Type :=
| nil : natlist
| cons : nat → natlist → natlist.

Fixpoint is_sorted (l : natlist ) : bool :=
    match l with
    |  nil => true
    |  (cons x nil) => true
    |  (cons x (cons y r)) => if x <= y then is_sorted (cons y r) else false
    end.

...

Theorem sort_spec : forall l, is_sorted (sort_list l).

Una especificación se puede codificar directamente en la declaración de clasificación utilizando tipos dependientes.

Para este problema en particular, John Darlington demostró en los años 70 que se pueden obtener 6 familias de algoritmos de clasificación transformando mecánicamente la especificación de un tipo en una implementación; Creo que esto se llama "derivación de programa basada en la semántica".

En el mundo de la ingeniería de software, la búsqueda de funciones extensivamente equivalentes se conoce como "detección de clones semánticos".

Dave Clarke también dio una buena respuesta a esta pregunta en CS StackExchange: /cs/2059/how-do-you-check-if-two-algorithms-return-the-same-result -para-cualquier-entrada

Todo esto cae bajo los paraguas de métodos formales y lenguajes de programación . La semántica denotacional es una clase de técnicas para modelar semántica, pero han caído en desgracia por ser difíciles de usar en comparación con la semántica operativa.


¡Gracias por la respuesta! Esto es exactamente lo que estaba buscando.
Matthijs Steen el

44
Estoy totalmente en desacuerdo con la declaración de que la semántica denotacional ha "caído en desgracia". Eso depende en gran medida de a quién le pregunte.
Andrej Bauer el

5

La igualdad de extensión en los lenguajes de programación completos de Turing es indecidible en general, pero eso no debería impedir que pueda verificar o falsificar que dos funciones específicas son extensivamente iguales.

La verificación puede proceder de muchas formas, por ejemplo, podría razonar en la teoría de conjuntos ZFC utilizando la semántica operativa. Sin embargo, eso sería doloroso. Si existe una semántica denotacional, también podrían usarse, pero la buena semántica denotacional solo existe para algunos idiomas. Por lo general, se utilizan lógicas de programa, por ejemplo, lógica de Hoare , para mostrar la igualdad extensional de los programas. Para poder hacer esto, las lógicas de Hoare para idiomas con funciones generalmente requieren un axioma que indique que , suponiendo que y son funciones de tipo (detalles de la variedad del axioma con los detalles del enfoque elegido para la lógica de Hoare).f g α βf=gxα.f(x)=g(x)fgαβ


Gracias por la respuesta. Examinaré la lógica de Hoare. ¿La semántica denotacional es difícil de definir en comparación con la lógica de Hoare, o es menos adecuada para la mayoría de los idiomas? ¿Es la igualdad extensional indecidible en general debido al problema de detención? Entonces, si las funciones se detuvieran siempre, como en los lenguajes funcionales totales, ¿no sería decidible en general? ¿O hay otras razones para ser indecidible en general?
Matthijs Steen

P0

... tiene una igualdad contextual decidible. Pero tenga en cuenta que R. Loader demostró que incluso la PCF finitaria tiene una equivalencia contextual indecidible.
Martin Berger

-2

Una respuesta rápida (admito que no pasé mucho tiempo ...) El teorema de Rice dice que para cualquier pregunta no trivial, es indecidible decir si la función calculada por un programa tendrá la propiedad o no. Por lo tanto, la pregunta aquí es indecidible


1
¿No establece que "... para cualquier propiedad no trivial de funciones parciales ...", entonces, ¿no sería posible decidir las funciones totales?
Matthijs Steen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.