Cours Apl 07
Fonctions de comparaisons, Booléens
Nous entrons ici dans le monde des Booléens, ou si vous préférez, des oui et des non.
Le oui est représenté par le nombre 1 et le non par 0.
- Les fonctions < > ≤ ≥ ne peuvent s'appliquer qu'à des nombres.
Elles font des comparaisons terme à terme entre 2 objets a priori de même taille.
Exemple :
5 7 3 < 3 5 7 0 0 1 9 > 3 8 20 12 9 1 1 0 0 0- Les fonctions = et ≠ acceptent indifféremment des arguments numériques ou alphabétiques.
Exemple :
'aabc' = 'papa' 0 1 0 0Seul le 2ème "a" de chaque vecteur correspondait.
'aabc' ≠ 'papa' 1 0 1 1- La fonction ∊ cherche si les éléments de G existent dans D, quel que soit leur emplacement et leur nombre. De même ∊, ne travaillant pas terme à terme, n'a aucune exigence concernant les structures de G et D. Par contre le résultat aura la structure de G.
Exemple :
'papa' ∊ 'chapeau' 1 1 1 1En effet le "p" et le "a" de papa se retrouvent bien dans chapeau.
(2 3 ⍴ ⍳ 6) ∊ 2 4 6 0 1 0 1 0 1- Une autre fonction intéressante est l'appartient souligné : ⍷
Il cherche les emplacements du vecteur G dans l'objet D de structure quelconque et en marque le début d'un 1. La structure du résultat est celle de D.
Exemple :
'pa' ⍷ 'papa est parti patauger' 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0A chaque fois que le vecteur 'pa' est détecté, on place un 1 à l'emplacement du 'p'.
- La dernière fonction de comparaison est la fonction "identique" : ≡
Contrairement à toutes les précédentes, elle ne travaille pas que sur le contenu des arguments mais sur eux dans leur globalité et rend donc un seul booléen pour dire si les objets sont identiques ou pas.
Exemples :
'papa'≡ 1 2 2 0 'abc' ≡ 'acb' 0 1 ≡ ,1 0Dans ce dernier exemple on aurait pu s'attendre à ce qu'Apl réponde oui, mais il compare aussi la structure des objets. Or 1 est un scalaire alors que ,1 est un vecteur. Ils ne sont donc pas identiques.
- La fonction not : ~ ,utilisée en mode monadique, retourne le contraire de ce qu'on lui soumet.
Exemple :
~ 0 0 1 1 0 1 1 0 0 1
Combiner les conditions
Il est fréquent de devoir combiner plusieurs tests.Par exemple pour savoir si un ou plusieurs nombres sont compris dans un intervalle, on doit tester si ils sont supérieurs à la borne inférieure et inférieurs à la borne supérieure.
- Il existe principalement 2 fonctions Apl pour cela : le "et" : ∧ et le "ou" : ∨
Exemple : Vtest ← 8 12 4 2 9 15
Je veux connaître les nombres compris entre 8 et 14, bornes incluses.
(Vtest ≥ 8) ∧ Vtest ≤ 14 1 1 0 0 1 0Décomposons :
En remplaçant chaque test par son résultat intermédiaire, on obtient :
(1 1 0 0 1 1) ∧ 1 1 1 1 1 0
Applications des booléens
- Exécution conditionnelle : L'utilisation la plus commune dans tous les langages est celle qui consiste à dire "Si oui alors je fais ci, sinon je fais ça".Cette possibilité est utilisée dans l'écriture des fonctions utilisateurs (programmes), que nous étudierons plus loin.
- On peut également utiliser les booléens en tant que nombres pour modifier la valeur d'un objet.
Exemple : on veut mettre à zéro tous les nombres inférieurs à 5
Ex ← 3 8 5 12 2 ¯3 (~Ex < 5) × Ex 0 8 5 12 0 0Décomposons :
Ex < 5 Inférieur à 5 ? 1 0 0 0 1 1 ~ 1 0 0 0 1 1 Le contraire 0 1 1 1 0 0 0 1 1 1 0 0 x Ex 0 8 5 12 0 0- L'utilisation la plus originale mais pas la moins efficace est la "compression". La fonction utilisée dans ce cas est le /
Exemple :
1 1 0 0 1 / 'abcde' 'abe'On peut également l'appliquer à une matrice : 1 1 0 0 / 3 4 ⍴⍳ 4
1 2 1 2 1 2On peut aussi compresser tout un objet avec un scalaire :
0 / 1 2 3 4 rend un vecteur de dimension 0.La compression est également utilisée pour faire des affectations partielles.
Exemple : soit phrase←'binjiur tintin'
On veut remplacer les i par des o.
Pour marquer les i, on écrit : phrase = 'i'
Pour les afficher : (phrase = 'i')/phrase
Pour les remplacer par des o :
((phrase = 'i')/phrase)←'o' phrase 'bonjour tonton'