DES PREDICATS ET DE LA SELECTION
Avec les fonctions dont nous disposons, il est déjà possible d’écrire un grand nombre de petits programmes utiles. Reste toutefois que tous ces programmes sont linéaires. Par cela, nous entendons qu’ils se constituent de suites d’instructions (de suites d’appels de fonctions) qui seront exécutées l’une après l’autre, sans possibilité de faire des tests ou des répétitions. Dans ce chapitre des fonctions particulières seront introduites, les prédicats, et une fonction de sélection ou de test qui se sert de ces prédicats.
Rappelons que des programmes peuvent être considérés comme des descriptions d’activités, comme des recettes de cuisine. Naturellement, comme dans les recettes de cuisine, il doit y avoir des possibilités de tester l’état du monde, par exemple il faut une possibilité de tester si l’eau est bouillante ou pas. Des fonctions de test sont, en logique, appelées des prédicats. Ce sont des fonctions posant des questions au quelles la réponse est soit oui, soit non. Elles testent la vérification d’une condition, et peuvent donc ramener deux valeurs possibles : oui ou non, comme à la question « est-ce que l’eau est bouillante ? » vous ne pouvez répondre que par oui ou par non (des réponses du style « pas encore » ne sont pas admises dans notre jeu), la machine ne peut, à l’évaluation d’un prédicat, que répondre par oui ou par non, vrai ou faux.
Non se dit en LISP NIL ou (), etoui se dit T. T est une abréviation de True, mot anglais pour vrai. Nil signifie en Latin et en ’colloquial english’ rien, faux, nul. Cette association entre le mot ’faux’ et le mot ’rien’ se retrouve en LISP : rappelons que NIL est également un mot pour désigner la liste vide (). NIL a donc en LISP plusieurs rôles : • c’est un atome. En LE_LISP, NIL est un atome, mais pas une variable : on ne peut pas lui associer une valeur. • c’est un nom pour la liste vide (la liste à 0 élément) • et c’est le mot LISP pour logiquement faux.
QUELQUES PREDICATS
Voici la définition syntaxique d’un premier prédicat – la fonction AT OM :
→ () si arg n’est pas un atome
(ATOM arg)
→ T si l’argument est un atome
Cette fonction teste donc si la valeur de son argument est un atome. Voici quelques exemples :
(ATOM ’BRAVO) → T (ATOM NIL) → T remarquez qu’il ne faut pas quoter l’atome NIL. De même, il ne faut pas quoter l’atome T et les nombres. On dit que de tels atomes sont des constantes (ATOM ()) → T ; par définition !!!! ; (ATOM ’(A B)) → () ; c’est une liste ! ; (ATOM 1024) → T (ATOM ’(GIRLS (ARE (COSIER)))) → ()
On a un prédicat qui teste si son argument est un atome, mais naturellement il existe également des prédicats testant les autres types d’objets LISP. Ainsi le prédicat NUMBERP teste si son argument est un nombre et le prédicat CONSP1 teste si son argument est une liste. Voici leurs définitions syntaxiques et quelques exemples d’appels :
→ NIL si arg n’est pas une liste
(CONSP arg)
→ T si l’argument est une liste
quelques exemples de CONSP :
(CONSP ’(A B C)) → T (CONSP ’BRAVO) → NIL (CONSP ()) → NIL ; !!!! par définition !!!! ; (CONSP ’((A)(B C))) → T (CONSP -1024) → NIL.et voici le prédicat NUMBERP :
→ NIL si arg n’est pas un nombre
(NUMBERP arg)
→ arg si l’argument est un nombre
Une première remarque s’impose : tout à l’heure il était signalé qu’en LISP vrai se dit T. Ce n’est pas tout à fait correct, il aurait fallu dire que faux se disait NIL en LISP, mais que LISP considère toute expression différente de NIL comme équivalente à T, c’est-à-dire vrai. C’est pourquoi dans la fonction NUMBERP le résultat peut être soit NIL, si l’argument n’est pas un nombre, soit, si l’argument est effectivement un nombre, la valeur de l’argument même. Tout les prédicats qui permettent de ramener comme valeur vrai l’argument de l’appel même, vont adhérer à cette convention qui est fort utile si l’on veut utiliser, dans la suite du programme, la valeur de l’argument. Nous y reviendrons à l’occassion. D’ailleurs, cette convention n’est pas possible pour la fonction AT OM, puisque l’appel(ATOM NIL) doit ramener en valeur vrai, c-à-d. T. Elle ne peut décemment pas, dans ce cas, ramener la valeur de l’argument, qui est NIL, donc la valeur LISP disant ’logiquement faux’.