6. Si-alors-sinon
6.1 Écriture et choix de méthode
Code (prolog) · sélectionner pour copier
relation(...) :-
( Condition
-> Alors
; Sinon
).
Il s’agit d’un schéma : les points de suspension doivent être remplacés par de vrais arguments et buts. Une condition réussie choisit la branche Alors; sinon, la branche Sinon. -> s’engage sur le premier succès de la condition; si la branche choisie échoue ensuite, cela ne fait pas automatiquement basculer vers Sinon.
Plusieurs buts d’une branche se combinent avec des virgules et se regroupent clairement : (Condition -> (A1,A2) ; (S1,S2)). Sans branche Sinon, (Condition -> Alors) échoue lorsque la condition échoue. La vidéo conseille de commencer par les formes simples.
L’enseignante autorise les solutions par plusieurs clauses ou par si-alors-sinon et n’impose pas l’une des deux pour ces exercices. La vidéo de conseils indique qu’en maîtriser une suffit pour ce type de travail, sous réserve des restrictions expressément indiquées dans une question d’examen. Les deux versions de l’intersection sont développées en §7.2.
6.2 Véhicules, sélecteur et contraintes partagées
Base de l’exemple :
Code (prolog) · sélectionner pour copier
possede(julie,auto,rouge).
possede(jean,auto,rouge).
possede(jean,auto,verte).
possede(marc,auto,rouge).
possede(jean,bicycle,rouge).
possede(nathalie,auto,noire).
possede(julie,bicycle,blanc).
Version par clauses :
Code (prolog) · sélectionner pour copier
v_poss(1,X) :- possede(X,bicycle,Y).
v_poss(2,X) :- possede(X,bicycle,Y), possede(X,auto,Y).
v_poss(R,X) :- R>2, possede(X,auto,Y).
Pour 1, chercher les propriétaires d’un vélo; pour 2, chercher ceux qui ont un vélo et une auto; pour un sélecteur supérieur à 2, ceux qui ont une auto. Le code du cas 2 impose en plus la même couleur Y aux deux véhicules. Jean satisfait cette condition avec rouge; Julie ne la satisfait pas, car son vélo est blanc et son auto rouge. Bien que l’oral dise ne pas utiliser la couleur, la répétition de Y constitue une contrainte réelle. Deux variables de couleur distinctes exprimeraient la possession des deux véhicules sans exiger une couleur commune.
Version conditionnelle du support, mise en forme :
Code (prolog) · sélectionner pour copier
v_poss_bis(R,X) :-
( R=1
-> possede(X,bicycle,Y)
; R=2
-> possede(X,bicycle,Y), possede(X,auto,Y)
; possede(X,auto,Y)
).
Pour un entier fixé au moins égal à 1, on retrouve les cas prévus. Mais le dernier Sinon ne teste plus R>2 : avec R=0, la première version échoue et la deuxième cherche les propriétaires d’auto. Avec R libre, R=1 est une unification qui la lie à 1 et engage cette branche; il ne s’agit pas d’un simple test numérique sur une valeur déjà donnée. L’oral suppose des entrées positives; préciser le contrat évite de généraliser l’équivalence des deux écritures à tous les appels.