Best viewed in 24pt and full-screen
next up previous contents
Next: L Up: A-Z Previous: H

I-J-K

type jointure (A->B) -> (B->C) -> (A->C) -> o .
jointure R1 R2 RJ :- pi xtex2html_wrap_inline56812(pi ytex2html_wrap_inline56812( RJ x y = sigma Jtex2html_wrap_inline56812( R1 x J, R2 J y ) )) .
ou
jointure R1 R2 xtex2html_wrap_inline56812ytex2html_wrap_inline56812(sigma Jtex2html_wrap_inline56812( R1 x J, R2 J y )) .


Jointure de deux relations. Version avec quantification universelle,
version avec tex2html_wrap_inline56836-abstraction.

I. (rel. logique combinatoire*) Combinateur identité. Il est régi par l'axiome suivant :

tex2html_wrap_inline54514

Il est définissable en tex2html_wrap_inline56836-calcul*, tex2html_wrap_inline54518, en logique combinatoire, tex2html_wrap_inline54520, et en tex2html_wrap_inline56836Prolog :

type comb_I (A->A) -> o .

comb_I I :- pi xtex2html_wrap_inline56812( I x = x ) .

Imitation. n.f. Une des opérations élémentaires du semi-algorithme de Huet*.

Pour chaque paire tex2html_wrap_inline54526, où tex2html_wrap_inline53950 est une tête flexible* (c'est-à-dire une variable logique*) et tex2html_wrap_inline51376 est une tête rigide*, si tex2html_wrap_inline51376 est une constante, la règle d'imitation produit la substitution* tex2html_wrap_inline54534, où chaque tex2html_wrap_inline54536 représente une application tex2html_wrap_inline54538, où tex2html_wrap_inline54582 est une variable logique nouvelle et d'un type approprié.

Après application de la substitution, de la tex2html_wrap_inline53988-réduction* et de la simplification*, le problème se ramène à résoudre les paires tex2html_wrap_inline54544 pour chaque tex2html_wrap_inline54546 (tex2html_wrap_inline54548).

Le principe de l'imitation est que puisque le terme rigide commence par un tex2html_wrap_inline51376, on va tenter de substituer tex2html_wrap_inline51376 à tex2html_wrap_inline53950. Cependant, tex2html_wrap_inline53950 et tex2html_wrap_inline51376 ne sont pas nécessairement du même type et ne peuvent donc pas être substitués l'un pour l'autre. Par exemple, tex2html_wrap_inline53950 attend tex2html_wrap_inline54574 paramètres, alors que tex2html_wrap_inline51376 en attend tex2html_wrap_inline54566. On va donc «habiller» tex2html_wrap_inline51376 de manière à obtenir un terme compatible avec tex2html_wrap_inline53950 ; d'où les tex2html_wrap_inline54574 abstractions pour les tex2html_wrap_inline54574 paramètres de tex2html_wrap_inline53950 et les tex2html_wrap_inline54578 qui dépendent des tex2html_wrap_inline54580 d'une manière laissée indéterminée.

L'introduction des tex2html_wrap_inline54582 fait qu'il n'est pas toujours possible de trouver un unificateur pertinent*.

Implication. n.f. (rel. implication classique* et implication intuitionniste*)

Implication classique. n.f. Connecteur logique formalisant la causalité et qui peut être décrit par la table de vérité suivante :

tabular38126

De cette table et de celles de la disjonction et de la négation il est facile de conclure que tex2html_wrap_inline54586. Le fait que tex2html_wrap_inline25015 (ex falso quod libet sequitur) est la source d'un grand nombre de discussions et de contre-propositions.

Implication intuitionniste. n.f. Connecteur logique formalisant la causalité intuitionniste. Dans ce cadre, la preuve par l'absurde (reductio ad absurdum), le tiers-exclus (tertium non datur : tex2html_wrap_inline54592) et l'élimination de la double négation (tex2html_wrap_inline54594) sont invalides. L'implication intuitionniste ne peut pas être décrite par une table de vérité finie, mais elle peut l'être par des règles de déduction (tex2html_wrap_inline55796 calcul des séquents*).

L'implication de tex2html_wrap_inline56836Prolog doit être interprétée par la règle de déduction intuitionniste. En particulier, prouver que la prémisse est fausse n'est jamais utilisé pour prouver un but formé d'une implication.

Inconnue. n.f. (tex2html_wrap_inline55796 variable logique*)

Indécidable. adj. (ant. décidable*)

Induction structurelle. n.f. (tex2html_wrap_inline55796 induction structurelle en Prolog typé* et induction structurelle en tex2html_wrap_inline56836Prolog*) Technique de programmation qui consiste à définir un calcul par récurrence sur la structure de ses entrées. Dans le cas de la programmation logique*, le calcul est défini par une relation et la notion d'entrée doit être relativisée (tex2html_wrap_inline55796 réversibilité*), mais le concept s'applique aisément comme une discipline de programmation.

Dans le cas de langages de programmation typés, cette technique peut être formalisée plus précisément car les types fournissent une description formelle des structures attendues. Par exemple, dans un langage comme tex2html_wrap_inline56836Prolog*, l'ensemble des termes qui ont un type donné est partiellement décrit par les constructeurs de terme* dont le type du résultat est le type en question. Une relation peut alors être définie au cas par cas en fonction des différents constructeurs du type de l'argument sur lequel est réalisée l'induction structurelle.

Le traitement de chaque cas est décrit par une règle associée à un constructeur et qui contient deux parties que l'on peut qualifier de syntaxique et de sémantique. La partie syntaxique consiste en des utilisations récursives de la relation à définir sur les arguments du constructeur qui ont le type considéré. La partie sémantique consiste dans l'application d'un prédicat à 1) tous les arguments du constructeur, 2) toutes les valeurs produites par les utilisations récursives de la relation et 3) la valeur associée au terme argument par la relation à définir.

Voir aussi la section «Transformations de grammaires en tex2html_wrap_inline56836Prolog»* -- pour un autre exemple de séparation entre un composant syntaxique et un composant sémantique. Dans ce cas, le composant syntaxique représente une induction structurelle sur les règles d'une grammaire considérées comme les constructeurs d'un type d'arbre de dérivation.

Inférence de type. n.f. (rel. condition de tête*) Calcul de notations de type manquantes. La syntaxe abstraite d'un langage typé comprend souvent de nombreuses notations de type dont beaucoup sont redondantes et peuvent être reconstituées automatiquement. On souhaite donc que la syntaxe concrète les laisse implicites. Beaucoup d'auteurs associent d'une part le typage «à la Curry», la notation implicite des types et l'inférence de type, et d'autre part le typage «à la Church» et la notation explicite des types par des déclarations. Nous pensons qu'il s'agit d'une erreur d'interprétation et que l'inférence de type a à voir avec la différence entre syntaxe concrète et syntaxe abstraite. Les deux syntaxes obéissent à des économies différentes. L'économie de la syntaxe concrète est celle de l'écriture et de la lecture, alors que l'économie de la syntaxe abstraite est celle des manipulations formelles. Dans le premier cas, on privilégie la concision et pour cela on admet des notations contextuelles. Dans le second cas, on souhaite que les propriétés des composants d'une expression se voient facilement, et pour cela on préfère des notations moins contextuelles.

La théorie de l'inférence de type est très «fragile» au sens où elle dépend très brutalement des caractéristiques du langage. Par exemple, le problème d'inférence de type pour tex2html_wrap_inline54612 est décidable [Milner 78], et même relativement facile en pratique, et il devient indécidable si on autorise le polymorphisme dans les définitions récursives [Mycroft 84]. De la même manière, le problème d'inférence de type pour Prolog est décidable en l'absence de la condition de tête* [Hanus 89a, Hanus 89b] et indécidable en présence de cette condition (voir aussi section «Typage»*).

Intentionnel. adj. (ant. extensionnel*) Se dit d'un procédé générique pour définir des ensembles ou des fonctions, ou pour prouver des propositions. La définition d'un ensemble par la propriété qu'ont tous ses éléments et eux seuls est intentionnelle, ainsi que la définition d'une fonction par un procédé de calcul. Une démonstration intentionnelle d'une quantification universelle ne peut pas procéder par cas ; si une proposition universelle intentionnelle est vraie, non seulement il y a une preuve pour chaque point du domaine, mais elle est la même pour tous les points.

tex2html_wrap_inline56836Prolog met en tex2html_wrap52064uvre le point de vue intentionnel. Les quantifications universelles permettent de spécifier qu'une relation doit vérifier certaines propriétés intentionnelles. Elles ne permettent pas de spécifier de propriétés extensionnelles. Par exemple, elles ne permettent pas de spécifier que deux relations ont le même graphe. Ainsi, tex2html_wrap_inline54616 n'est pas démontrable. En d'autres termes, la quantification universelle des formules de Harrop intuitionnistes n'a pas de caractère énumératif. Même si dans cet exemple on peut inférer que tex2html_wrap_inline53952 est de type tex2html_wrap_inline54620, la preuve du but universel ne se fera pas en remplaçant tex2html_wrap_inline53952 par tous les individus possibles (tex2html_wrap_inline54624, tex2html_wrap_inline54626, ...). La variable tex2html_wrap_inline53952 est simplement remplacée par une nouvelle constante, différente de tous les individus connus. Si une preuve est possible avec cette nouvelle constante, elle le sera avec n'importe quel individu. Donc, la formule tex2html_wrap_inline54630 ne signifie pas seulement que tout tex2html_wrap_inline53952 (du bon type) a la propriété tex2html_wrap_inline54634, mais aussi que la preuve est la même pour tous.

Itérateur. n.m. (rel. induction structurelle*) On peut déduire de tout type inductif* une fonction d'ordre supérieur qui remplace chaque constructeur d'un terme de ce type par des fonctions passées en paramètre [Böhm et Berarducci 85, Pierce et al. 89, Huet et al. 97]. On appelle cette fonction un itérateur. Cela formalise l'observation que beaucoup de programmes de calcul sur les listes (conc, longueur, etc.) se ressemblent et qu'il en est de même pour de nombreuses autres structures de données. En ce sens, choisir une structure de données c'est choisir une classe d'algorithmes, ceux qu'on peut définir avec l'itérateur de la structure de données. Il faut quand même remarquer que tout calcul sur un type n'est pas représentable par l'itérateur de ce type. Par exemple, le parcours dichotomique d'une liste n'est pas représentable de cette manière.

Les termes d'un type inductif peuvent être représentés par des tex2html_wrap_inline56836-termes qui sont leurs propres itérateurs. Par exemple, la représentation des listes par les combinateurs suivants réalise cet effet :

NIL = ctex2html_wrap_inline56812ntex2html_wrap_inline56812n

CONS = gtex2html_wrap_inline56812dtex2html_wrap_inline56812ctex2html_wrap_inline56812ntex2html_wrap_inline56812(c g (d c n))

On peut aussi traduire chaque type inductif en un prédicat qui réalise son itérateur. Par exemple, le prédicat qui réalise l'itérateur des listes est le suivant :

type iter_liste R -> (A->R->R) -> (list A) -> R -> o .

iter_liste N C [] N .

iter_liste N C [E|Es] (C E T) :- iter_liste N C Es T.

Dans cette variante, le traitement appliqué à chaque cons est décrit par une fonction. On peut vouloir le décrire par un prédicat, surtout en tex2html_wrap_inline56836Prolog où le langage des formules logiques est plus puissant que celui des termes. On obtiendrait ainsi la définition suivante :

type iter_liste R -> (A->R->R->o) -> (list A) -> R -> o .

iter_liste N C [] N .

iter_liste N C [E|Es] R :- iter_liste N C Es T , C E T R .

K. (rel. logique combinatoire*) Combinateur de projection. Il est régi par l'axiome suivant :

tex2html_wrap_inline54658

Il est définissable en tex2html_wrap_inline56836-calcul* : tex2html_wrap_inline54662 et en tex2html_wrap_inline56836Prolog :

type comb_K (A->B->A) -> o .

comb_K K :- pi xtex2html_wrap_inline56812(pi ytex2html_wrap_inline56812( (K x y) = x )) .


next up previous contents
Next: L Up: A-Z Previous: H

Olivier Ridoux
Mon Apr 27 11:10:23 MET DST 1998