Précédent Index Suivant

Alternative et conditionnelle

 
 
Alternative alternative
 
Exemples  
Les expressions peuvent être définies par cas au moyen d'alternatives. Par exemple:
 
;;; valeur-absolue : Nombre -> Nombre 
;;; (valeur-absolue x) rend la valeur absolue de «x» 
(define (valeur-absolue x)
  (if (>= x 0) 
      x 
      (- x)))
 

 
Notons que nous pourrions aussi utiliser le prédicat negative? que nous avons définie ci-dessus:
 
;;; valeur-absolue-bis : Nombre -> Nombre 
;;; (valeur-absolue-bis x) rend la valeur absolue de «x» 
(define (valeur-absolue-bis x)
  (if (negative? x) 
      (- x) 
      x))
 

 
Grammaire  
La syntaxe d'une alternative suit la grammaire suivante:  
<alternative> -> (if <condition> <conséquence> )
    (if <condition> <conséquence> <alternant> )
   

<condition> -> <expression>
   

<conséquence> -> <expression>
   

<alternant> -> <expression>
   
 

 
Remarques:
 
Évaluation d'une alternative  
Une alternative s'évalue ainsi: la condition est d'abord évaluée. Si sa valeur est vraie, alors seulement la conséquence est évaluée (et la valeur de l'alternative est égale à la valeur de cette évaluation) sinon seulement l'alternant est évalué.
 
Ainsi, contrairement aux applications, pour une alternative, on ne commence pas par évaluer tous ses composants: on dit qu'une alternative est une forme spéciale.
 
Écriture des conditions  
Les conditions peuvent être construites avec les opérations logiques suivantes:
 
Tout d'abord la négation: il existe une fonction prédéfinie not:  
;;; valeur-absolue-ter : Nombre -> Nombre 
;;; (valeur-absolue-ter x) rend la valeur absolue de «x» 
(define (valeur-absolue-ter x)
  (if (not (negative? x)) 
      x 
      (- x)))
 

 
Remarque: la fonction not, qui rend un booléen, n'est pas un prédicat, mais une opération car elle a comme donnée un booléen (ainsi, elle a le même status que, par exemple, l'opération moins unaire sur les entiers -- comme dans l'application (- 3)).
 
On peut écrire aussi des conjonctions et des disjonctions en suivant les règles de grammaire suivantes:  
<conjonction> -> (and <expression>*)
   

<disjonction> -> (or <expression>*)
   
 

 
La conjonction et la disjonction ne sont pas des fonctions -- comme la fonction not -- mais des formes spéciales -- comme l'alternative:
 
Pour évaluer (and e1 e2 e3),
  1. on évalue l'expression e1: si elle est fausse, toute l'expression est fausse et on n'évalue pas e2 et e3;
  2. si e1 est vraie, on évalue l'expression e2: si elle est fausse, toute l'expression est fausse et on n'évalue pas e3;
  3. si e1 et e2 sont vraies, on évalue l'expression e3: si elle est fausse, toute l'expression est fausse et si elle est vraie, toute l'expression est vraie.
 
De même, pour évaluer (or e1 e2),
  1. on évalue l'expression e1: si elle est vraie, toute l'expression est vraie et on n'évalue pas e2;
  2. si e1 est fausse, on évalue l'expression e2: si elle est vraie, toute l'expression est vraie et si elle est fausse, toute l'expression est fausse.
 
 
Conditionnelle conditionnelle
 
L'alternative permet d'écrire des expressions dont la valeur est spécifiée selon deux cas. S'il y a plus de deux cas, on écrit une alternative dont la conséquence ou l'alternant est une alternative.
 
Exemples  
Considérons, par exemple, la fonction signe spécifiée par:
 
;;; signe : Nombre -> nat 
;;; (signe x) rend -1, 0 ou +1 selon que «x» est négatif, nul ou positif 
 

 
On peut écrire une définition en utilisant des alternatives:
 
(define (signe x)
  (if (< x 0)
      -1
      (if (= x 0)
          0
          1)))
 

 
Mais, au lieu d'utiliser une cascade d'alternatives, il est préférable, pour la lisibilité, d'utiliser une conditionnelle:  
(define (signe x)
  (cond ((< x 0) -1)
        ((= x 0) 0)
        (else 1)))
 

 
Grammaire  
La syntaxe d'une conditionnelle suit la grammaire suivante:  
<conditionnelle> -> (cond <clauses> )
   

<clauses> -> <clause> <clause>*
    <clause>*(else <expression> )
   

<clause> -> ( <condition> <expression> )
   
 

 
Remarques:
 
Évaluation d'une conditionnelle  
Une conditionnelle s'évalue ainsi:
 
Conditionnelles et alternatives  
Les conditionnelles ne sont pas essentielles, car elles peuvent être réécrites sous la forme d'alternatives:  
(cond (else e))  devient  e
(cond (c1 e1) (else e2)))   devient   (if c1 e1 e2) 
(cond (c1 e1) (c2 e2) ... ))  devient   (if c1 e1 (if c2 e2 (if ....)))

 
Piège à éviter  
Souvent, en mathématique ou dans le langage courant, les définitions par cas sont données en spécifiant chacun des cas, indépendemment les uns des autres. Par exemple, pour définir la valeur absolue d'un nombre x, on écrit souvent:  
Lorsque l'on traduit une telle définition dans un langage de programmation, en particulier en Scheme, on doit -- pour l'efficacité et la lisibilité -- supprimer les tests inutiles. Ainsi, dans la définition Scheme que nous avons donnée, nous testons si x est supérieur ou égal à 0 et nous ne testons pas explicitement que x est inférieur à 0 (puisque, lorsque x n'est pas supérieur ou égal à 0, il est inférieur à 0).



Auteur(s): titou@ufr-info-p6.jussieu.fr.Mainteneur de la page: titou@ufr-info-p6.jussieu.fr.
 

Précédent Index Suivant