Algorithmes d'inversion de programme pour les programmes d'ordre supérieur

10

Le terme inversion de programme a plusieurs nuances de sens, mais a probablement commencé avec le travail de J. McCarthy de 1956, The Inversion of Functions Defined by Turing Machines dans le contexte de l'IA. À présent, de nombreuses connexions entre l'inversion de programme et d'autres domaines ont été découvertes, par exemple la programmation réversible (physique et logique), l'évaluation partielle, la vérification, la programmation bidirectionnelle, la programmation logique et l'apprentissage automatique.

Qu'est-ce que l'inversion de programme? En première approximation , il est quelque chose comme ceci: Étant donné un programme prenant des arguments de type A et le retour des résultats de type B , produire un programme P - 1 qui est « en quelque sorte » l'inverse de P . Je suis délibérément vague ici, car le concept peut être (et est) clarifié de diverses manières: par exemple, P doit-il être injectif? Faut - P - 1 ( b ) retourner tout ou seulement une partie d' une telle que P ( a ) = bP:ABABP1PPP1(b)aP(a)=b?

Il existe des moyens génériques d'inverser un programme, par exemple en utilisant la diagonalisation comme déjà souligné par McCarthy, ou en utilisant une évaluation partielle, mais ils ont tendance à ne pas être efficaces. De plus, la plupart des travaux sur l'inversion de programmes que je connais ne semblent pas concerner les langages de programmation d'ordre supérieur (c'est-à-dire -calculi).λ

Demande de réference. Quel est l'état de l'art dans les algorithmes explicites pour l'inversion de programme des -calculi (sans restriction sur l'ordre supérieur)?λ

Martin Berger
la source

Réponses:

5

Il n'y a pas eu énormément de travail dans cet espace, mais quel travail il y a, est assez intéressant.

  1. Torben Mogensen a travaillé sur ce problème. Voici deux de ses papiers.

    Le premier article donne un algorithme pour les programmes fonctionnels de premier ordre, et le second l'étend à un ordre supérieur. La caractérisation précise du moment où cet algorithme réussira est laissée aux travaux futurs.

  2. Tetsuo Yokoyama, Holger Bock Axelsen et Robert Glück.

    Cela décrit le langage de programmation RFun, qui inverse les programmes fonctionnels de premier ordre, mais impose des contraintes d'injectivité et de déterminisme en amont qui garantissent que l'évaluation en amont est aussi rapide que vers l'avant. (Ils ont écrit un certain nombre d'autres articles sur ce sujet, que j'ai eu du mal à obtenir.)

  3. Stefan Bohne et Baltasar Trancón Widemann.

    Ceci est un papier vraiment soigné! Il observe que (a) vous pouvez construire une catégorie où les morphismes sont des fonctions appariées avec leur inverse (quelle que soit la notion particulière d'inverse que vous utilisez), et (b) cette catégorie a une structure compacte de poignard. Cela signifie que vous pouvez écrire un programme avec une discipline de type linéaire légèrement funky, puis lire les interprétations avant et arrière de la sémantique.

    Ils donnent un langage fonctionnel avec une syntaxe assez sauvage: des expressions presque arbitraires peuvent être utilisées comme modèles, et la réversibilité le rend sensible.

  4. Francesco Tiezzia, Nobuko Yoshida

    Je n'ai pas lu celui-ci, mais je viens juste de le découvrir lors d'une recherche sur Google pour les autres articles. Compte tenu des auteurs et du sujet, je soupçonne que c'est votre affaire!

Neel Krishnaswami
la source
Merci. (2, 3, 4) ne font pas d'inversion de programme, mais conçoivent des langages de programmation où les programmes sont réversibles / inversibles par définition. Il s'agit d'un problème étroitement lié mais différent. En fait, je ne sais pas très bien comment ces problèmes sont liés. Je n'avais pas vu de semi-inversion avant peut-être que cela résout déjà le problème puisque l'inversion semble être un cas de bord de semi-inversion? Le deuxième article de BTW Mogensen ne monte qu'au 2e ordre.
Martin Berger
@MartinBerger: Je suppose que la relation dépend de la raison pour laquelle vous souhaitez utiliser l'inversion de programme! Je me suis intéressé au problème parce que je regardais l'inférence de type (si vous avez des fonctions de niveau type, il est utile de pouvoir inverser ces fonctions pour comprendre les instanciations des quantificateurs), et donc restreindre le langage n'était pas un étalage pour moi. Qu'essayez-vous de faire?
Neel Krishnaswami
En ce moment je m'intéresse au problème général et abstrait. Mon intérêt pour l'inversion de programme vient de la vérification de programme. Et je ne pouvais trouver nulle part qui prenne simplement un terme lambda (de PCF disons ou STLC) et l'inverse. Est-ce parce que je ne cherche pas au bon endroit?
Martin Berger