Logique combinatoire
En logique mathématique, la logique combinatoire est une théorie logique[1] introduite par Moses Schönfinkel[2] en 1920 lors d'une conférence et développée dÚs 1929 par Haskell Brooks Curry[3] pour supprimer le besoin de variables en mathématiques, pour formaliser rigoureusement la notion de fonction et pour minimiser le nombre d'opérateurs nécessaires pour définir le calcul des prédicats à la suite de Henry M. Sheffer. Plus récemment, elle a été utilisée en informatique comme modÚle théorique de calcul et comme base pour la conception de langages de programmation fonctionnels.
Le concept de base de la logique combinatoire est celui de combinateur qui est une fonction d'ordre supérieur ; elle utilise uniquement l'application de fonctions et éventuellement d'autres combinateurs pour définir de nouvelles fonctions d'ordre supérieur. Chaque combinateur simplement typable est une démonstration à la Hilbert en logique intuitionniste et vice-versa [4]. On appelle ceci la correspondance de Curry-Howard
Introduction
La logique combinatoire est fondĂ©e sur deux « opĂ©rations » de base (on dit aussi deux « combinateurs ») S et K que nous dĂ©finirons plus loin ; plus prĂ©cisĂ©ment nous en dĂ©finirons le comportement ou l'« intention », car la logique combinatoire est une approche de la logique qui montre plutĂŽt comment marchent les choses que comment les objets peuvent ĂȘtre dĂ©crits, on dit alors que c'est une approche intentionnelle de la logique. Si l'on veut dĂ©finir la fonction[5] que nous appellerons C et qui prend trois paramĂštres et rend comme rĂ©sultat le premier appliquĂ© au troisiĂšme, le tout Ă©tant appliquĂ© au second, on pourra l'Ă©crire :
- C ⥠S ((S (K S) K) (S (K S) K) S) (K K)
qui, comme on le voit, ne comporte pas de variable. On pourra regretter que l'avantage de ne pas utiliser de variables se paie par la longueur des expressions et une certaine illisibilité. Aujourd'hui la logique combinatoire est surtout utilisée par les logiciens pour répondre positivement à la question « Est-il possible de se passer de variables ? » et par les informaticiens pour compiler les langages fonctionnels[6].
La logique combinatoire est un systÚme de réécriture du premier ordre. C'est-à -dire qu'à la différence du lambda-calcul, il ne comporte pas de variables liées, ce qui permet une théorie beaucoup plus simple. Il n'a que trois opérateurs : un opérateur binaire et deux constantes.
- Le parenthésage
- Pour alléger l'écriture, la logique combinatoire supprime certaines parenthÚses et adopte par convention l'associativité à gauche. En d'autres termes, (a b c d ... z) est un raccourci d'écriture pour (...(((a b) c) d) ... z)[7].
Les combinateurs de base
Le combinateur identité, noté I, est défini par[8]
- I x = x.
Un autre combinateur, noté K, fabrique des fonctions constantes : (K x) est la fonction qui, pour tout paramÚtre, retourne x, autrement dit
- (K x) y = x
pour tous termes x et y. Comme en lambda-calcul, on associe les applications de gauche Ă droite, ce qui permet de supprimer des parenthĂšses, ainsi on Ă©crit
- K x y = x.
Un autre combinateur, noté S, distribue le paramÚtre (ici z) aux applications composantes :
- S x y z = x z (y z)
S applique le résultat de l'application de x à z au résultat de l'application de y à z.
I peut ĂȘtre construit Ă partir de S et K, en effet :
- (S K K) x = S K K x
- = K x (K x)
- = x.
On décrÚte donc que I est un combinateur dérivé et que I = S K K et on décide de décrire tous les combinateurs à l'aide de S et K, ce qui est raisonnable car on peut montrer que cela suffit pour décrire « toutes » les fonctions d'une certaine forme[9].
La réduction
En fait, les transformations fonctionnent comme des rĂ©ductions et pour cela on les note â. On obtient donc les deux rĂšgles de rĂ©duction de base de la logique combinatoire.
- K x y â x,
- S x y z â x z (y z).
Quelques combinateurs dérivés
- B ⥠S (K S) K. Le combinateur B correspond à l'opérateur de composition des fonctions habituellement noté « ». Son nom est dérivé du syllogisme Barbara. On a donc
- B x y z ⥠S (K S) K x y z
- â K S x (K x) y z
- â S (K x) y z
- â K x z (y z)
- â x (y z).
- B x y z ⥠S (K S) K x y z
- C ⥠S (B B S) (K K) est un combinateur qui intervertit ses paramÚtres.
- C x y z ⥠S (B B S) (K K) x y z
- â B B S x (K K x) y z
- â B (S x) (K K x) y z
- â S x (K K x y) z
- â x z (K K x y z)
- â x z (K y z)
- â x z y
- C x y z ⥠S (B B S) (K K) x y z
- W ⥠S I I. Le combinateur W permet de construire un autre combinateur Ă savoir W W, qui a la propriĂ©tĂ© de se rĂ©duire Ă lui-mĂȘme. On a ainsi
- W W ⥠S I I (S I I)
- â I (S I I) (I (S I I))
- â S I I (I (S I I))
- â S I I (S I I) ⥠W W
- W W ⥠S I I (S I I)
Le systĂšme de type
On peut associer un type Ă chacun des combinateurs. Le type d'un combinateur dit comment il prend en compte le type de ses paramĂštres pour produire un objet d'un certain type. Ainsi le combinateur I change son paramĂštre en lui-mĂȘme ; si on attribue le type α Ă ce paramĂštre x, alors on peut dire que Ix a le type α et que I a le type α â α. Ici la flĂšche â dĂ©signe le constructeur de type fonctionnel, en gros α â α est le type de la classe des fonctions de α vers α, â a construit un nouveau type α â α Ă partir du type α.
K prend un paramĂštre, disons de type α et rend une fonction d'un paramĂštre de type ÎČ qui rend le premier paramĂštre, le type de cette derniĂšre fonction est donc ÎČ â α et le type de K est ainsi α â (ÎČ â α), que l'on Ă©crit α â ÎČ â α. S prend trois paramĂštres x, y et z ; donnons le type α au troisiĂšme paramĂštre z et le type Îł au rĂ©sultat final, le deuxiĂšme paramĂštre y prend un paramĂštre de type α et rend un paramĂštre de type disons ÎČ (son type est donc α â ÎČ), le premier paramĂštre x prend un paramĂštre de type α et rend une fonction de type ÎČ â Îł, son type est donc α â (ÎČ â Îł), que l'on Ă©crit α â ÎČ â Îł. RĂ©sumons-nous, on a z:α , y: ÎČ â α et x: α â ÎČ â Îł et S x y z: Îł, on en conclut que S a le type (α â ÎČ â Îł) â (α â ÎČ) â α â Îł.
Le rĂ©sultat M N qui consiste Ă appliquer M Ă N est typable si M a un type fonctionnel, disons α â ÎČ et si N a pour type α. M N a alors pour type ÎČ.
Le type de B est (α â ÎČ) â (Îł â α) â Îł â ÎČ. On le voit soit en remarquant que B x y z â* x (y z), soit en appliquant la rĂšgle de composition Ă S (K S) K.
Le type de C est (α â ÎČ â Îł) â ÎČ â α â Îł, pour les mĂȘmes raisons que celles invoquĂ©es pour B.
W en revanche n'est pas typable. On peut voir cela en se rappelant que S : (α â ÎČ â Îł) â (α â ÎČ) â α â Îł et I : (α â α). Si on applique S Ă I on doit avoir α = ÎČ â Îł, puis si on applique S I Ă I on doit avoir α = ÎČ, donc ÎČ = ÎČ â Îł. Cette Ă©quation n'a pas de solution. Donc S I I = W n'est pas typable.
En résumé:
- K : α â ÎČ â α
- S : (α â ÎČ â Îł) â (α â ÎČ) â α â Îł
- I : α â α
- B : (α â ÎČ) â (Îł â α) â Îł â ÎČ
- C : (α â ÎČ â Îł) â ÎČ â α â Îł
Forte normalisation
Si M est un combinateur typé, alors toute chaine de réduction qui commence en M est finie. On appelle cette propriété la forte normalisation.
La logique combinatoire et la correspondance de Curry-Howard
On constate que le modus ponens
ressemble Ă la rĂšgle de conservation des types quand on applique un combinateur de type α â ÎČ Ă un combinateur de type α. Examinons aussi les deux premiers axiomes de la prĂ©sentation Ă la Hilbert de la logique propositionnelle Ă savoir:
- K : P â Q â P
- S : (P â Q â R) â (P â Q) â P â R.
Rappelons qu'ils permettent de formaliser le calcul propositionnel intuitionniste. On remarque que le premier axiome est identique au type de K et que le deuxiĂšme axiome est identique au type de S si l'on remplace la proposition P par α, la proposition Q par ÎČ et la proposition R par Îł. Cette correspondance entre proposition et type et entre combinateur et dĂ©monstration s'appelle la correspondance de Curry-Howard. Elle met en parallĂšle le systĂšme de dĂ©duction Ă la Hilbert pour la logique propositionnelle intuitionniste et la logique combinatoire qui ont Ă©tĂ©, notons-le, dĂ©couverts indĂ©pendamment.
Un exemple
La formule
- B : (α â ÎČ) â (Îł â α) â Îł â ÎČ
signifie (dans le langage de Coq, par exemple) que B est une preuve de la formule propositionnelle (α â ÎČ) â (Îł â α) â Îł â ÎČ.
- B ⥠S (K S) K
fournit alors une preuve effective de la formule dans la théorie de Hilbert qui n'emploie que le modus ponens et les axiomes K et S.
Cela demande un petit travail de réécriture: Tout d'abord, on rétablit les parenthÚses
- B ⥠(S (K S)) K
ensuite, on introduit l'opĂ©rateur â
- B ⥠(S â (K â S)) â K
enfin, on emploie la notation postfixée :
- B ⥠K S K â S â â
Alors cette formule donne les Ă©tapes de la dĂ©monstration dans le sens de la dĂ©duction[10]. â dĂ©note le recours au modus ponens ; K et S, l'utilisation des axiomes K et S. Plus, prĂ©cisĂ©ment Q ⥠I P â signifie que si I est la dĂ©monstration de P â Q, et P la dĂ©monstration de P, alors I P â est bien celle de Q. Malheureusement cette formule ne fournit pas les opĂ©rations de substitutions qui doivent ĂȘtre utilisĂ©es dans l'introduction des axiomes.
La notation préfixée,
- B ⥠â â S â K S K
représente le sens de la démonstration dans le langage de Coq[11]. Ici, les informations manquantes sont les formules des P employés dans les modus ponens.
Correspondance avec le λ-calcul
Toute expression de la logique combinatoire admet une expression du λ-calcul équivalente, et toute expression du λ-calcul admet une expression de la logique combinatoire équivalente.
De la logique combinatoire vers le λ-calcul
Notons la traduction des combinateurs vers le λ-calcul, elle est définie par :
- si désigne une variable, ;
- ;
- ;
- , pour tous combinateurs et .
Abstraction en logique combinatoire
Avant de définir la représentation du λ-calcul en logique combinatoire nous avons besoin de définir une abstraction dans la logique combinatoire [12]. Si est un terme, on définit qui va jouer le rÎle de .
Du λ-calcul à la logique combinatoire
On définit l'interprétation des termes du λ-calcul en termes de la logique combinatoire:
Exemple
Le combinateur de point fixe de Turing, noté a pour expression en λ-calcul . On peut alors calculer :
puis
On dĂ©finit alors deux combinateurs A et Î
A:=S (S (K S) (K I)) (S I I)
Î: =A A
Î est un combinateur de point fixe.
On observe que, qu'il s'agisse du λ-terme ou de sa traduction en tant que combinateur, on a
ProblÚmes indécidables en logique combinatoire
Une forme normale est un combinateur dans lequel les combinateurs primitifs ne sont pas appliquĂ©s Ă suffisamment d'arguments pour pouvoir ĂȘtre simplifiĂ©s. Il est indĂ©cidable de savoir si un combinateur gĂ©nĂ©ral possĂšde une forme normale, si deux combinateurs sont Ă©quivalents, etc. C'est Ă©quivalent Ă l'indĂ©cidabilitĂ© des problĂšmes correspondants du [[lambda-calcul|lambda-calcul]].
Références
- Katalin BimbĂł, The Stanford Encyclopedia of Philosophy, Metaphysics Research Lab, Stanford University, (lire en ligne)
- Moses Schönfinkel "Ăber die Bausteine der mathematischen Logik", Mathematische Annalen 92, p. 305-316. Traduit en français par GeneviĂšve Vandevelde : Moses Schönfinkel, « Sur les Ă©lĂ©ments de construction de la logique mathĂ©matique », MathĂ©matiques et sciences humaines, vol. 112,â , p. 5-26 (lire en ligne) et traduit en anglais dans Moses Schönfinkel (trad. Stefan Bauer-Mengelberg), « On the building blocks of mathematical logic », dans Jean van Heijenoort, A Source Book in Mathematical Logic, 1879-1931, Harvard Univ. Press, (lire en ligne), p. 355-66.
- H. B. Curry, « Grundlagen der Kombinatorischen Logik », American Journal of Mathematics, vol. 52, no 3,â , p. 509â536 (DOI 10.2307/2370619, lire en ligne, consultĂ© le )
- H. Curry, J. R. Hindley et J. P. Seldin, Combinatory Logic II. North-Holland, 1972.
- Plus précisément le combinateur.
- Quoique les informaticiens utilisent une logique fondée sur des super-combinateurs moins bavarde que la logique combinatoire fondée sur S et K.
- Cette convention est plutÎt malheureuse car on adopte l'associativité à droite pour l'écriture du type du combinateur.
- x qui apparaßt ici n'est pas une variable du langage de la logique combinatoire, car comme on l'a dit la logique variable se passe de variables ; en fait, x est une « méta-variable » qui permet de présenter les identités de la logique combinatoire.
- ThéorÚme de complétude de Harvey Friedman.
- C'est-Ă -dire, que l'on va des hypothĂšses (ici des axiomes) au but Ă atteindre.
- C'est-à -dire, l'ordre des tactiques (« tactic » en anglais) employées. Coq procÚde par modification du but jusqu'à l'identifier aux hypothÚses, aux théorÚmes, ou aux axiomes.
- J. Roger Hindley et Jonathan P. Seldin, Lambda-Calculu and Combinators an Introduction, Cambrdige University Press, (lire en ligne) Section 2C p. 26.
Bibliographie
- Haskell Curry et Robert Feys, Combinatory Logic I. North Holland 1958. La plupart du contenu de cet ouvrage fut rendu obsolĂšte par l'ouvrage de 1972 et les suivants.
- H. Curry, J. R. Hindley et J. P. Seldin, Combinatory Logic II. North-Holland, 1972. Une rétrospective complÚte de la logique combinatoire, incluant une approche chronologique.
- J. Roger Hindley et Jonathan P. Seldin, Lambda-Calculu and Combinators an Introduction, Cambrdige University Press, (lire en ligne)
- J.-P. Desclés & ali, Logique Combinatoire et Lambda-calcul - des logiques d'opérateurs - 2016 - CépaduÚs* J.-P. Desclés & ali, Calculs de Signification par une logique d'opérateurs - 2016 - CépaduÚs
- Jean-Pierre Ginisti, La logique combinatoire, Paris, PUF (coll. « Que sais-je? » n°3205), 1997, 127 p.
- M. Shönfinkel, In: J. van Heijenoort, Editor, From Frege to Gödel, Harvard University Press, Cambridge, MA (1967), pp. 355â366 1924.
- J.-L. Krivine, Lambda-calcul, types et modĂšles, Masson, 1990, chap. Logique combinatoire, traduction anglaise accessible sur le site de l'auteur .
- Robert Feys, La technique de la logique combinatoire In: Revue Philosophique de Louvain. TroisiÚme série, tome 44, n°1, 1946. pp. 74-103
- (en) Henk Barendregt, The Lambda-Calculus, volume 103, Elsevier Science Publishing Company, Amsterdam, 1984.