A propos de l’Epsilon souligné

par Alain Delmotte

 

 

Dans le numéro 20 des Nouvelles, Gérard Langlet demandait quel est l'équivalent J du « Find » (º epsilon souligné) d'APL*PLUS.

Dans le numéro 21 j'avais proposé une fonction explicite. Mais dans le même numéro, Michel Dumontier en page 98 écrit :

 

« Réponse : c'est E. voir les Nouvelles d'APL N° 16 de septembre 1995, page 64, Cours de J leçon 3, j'avais pourtant donné un exemple qui aurait dû frapper les esprits !

 

        Je le reproduis ici :

   ?'co' E. 'cocoricoco-co'

1 0 1 0 0 0 1 0 1 0 0 1 0

 

        NB. il faut lire les nouvelles d'APL avec un peu plus d'attention !... »

 

..... ! !

 

Après avoir refait les tests sur les exemples de STSC/APL*PLUS et constaté que E. ne répond pas entièrement à la définition de epsilon souligné, j'ai adressé un message au « newsgroup » comp.lang.apl demandant comment écrire, sous forme tacite, les fonctions proposées dans le numéro 21 des Nouvelles.

 

Voici la traduction de la réponse de Roger Hui (elle commence par une reprise de mon message) :

 

---------------------------------------------

Alain Delmotte écrit le dimanche 5 janvier :

> Dans le numéro 20 des « Nouvelles d'APL », la revue de

> l'Association francophone d'APL, Gérard Langlet demandait

> quel est l'équivalent J de la fonction « Find » (epsilon

> souligné) d'APL*PLUS.

>

> Dans le numéro 21, Michel Dumontier répond que c'est E.

> (membre d'intervalle), mais j'ai proposé, dans le même

> numéro, les fonctions suivantes qui utilisent la forme

> diadique du verbe « couper » avec un coefficient 3 (tuiles) :

>

> eun=: 3 : 0

> :

> c=.1, ,: $x.     NB. taux de glissement des sous unités de y.

>                  NB. à comparer à x. ; le taux de glissement

>                  NB. est 1 dans chaque direction

> d=. $ $ x.       NB. rang de la comparaison

> x.-:"d c{;.3 y.

> )

>

> eu=: 3 : 0

> :

> x. -:"($$x.)(1,,:$x.)[;.3 y.

> )

>

>   a=. 'co'

>   b=. 'cocoa'

>

> et pour l'exemple du « Quick Reference Guide » d'APL*PLUS

> (Ch.H. Lee, pour le PC, STSC, 1986)

>   c=. 2 2 $ 2 3 3 1

>   d=. 3 4 $ 1 2 3

>

>   a E. b

> 1 0 1 0 0

>   c E. d

> |nonce error

> |  c  E.d

>   a eun b

> 1 0 1 0 0

>   c eun d

> 0 1 0 0

> 1 0 0 0

> 0 0 0 0

>

> Est-il possible d'obtenir une réponse correcte avec E. et un

> rang approprié ?

> Comment écrire eun (eu) sous forme tacite ?

 

E. n'est implémenté pour le moment que pour des arguments chaînes (vecteurs). D'où le « nonce error ».

 

Une implémentation de E. en terme de tuiles peut en effet être écrite sous forme tacite. A partir de "eu" ci-dessus,

 

eu=: 3 : 0

:

x. -:"($$x.)(1,,:$x.)[;.3 y.

)

 

les simplifications suivantes sont possibles :

 

a. Une définition explicite exclusivement diadique peut être

   écrite plus succinctement comme  4 : blabla

b. 1,,:vec  est équivalent à  1,:vec

c. un argument gauche 1,:vec pour les tuiles est équivalent à

   un argument gauche de vec seul.

 

Donc :

 

  eu1= : 4 : 'x. -:"($$x.)($x.)[ ;.3 y.'

 

De plus, ici [;.3 est utilisé pour générer un tableau de cellules de taille $x. , et chaque cellule est comparée à x. Ceci peut être fait de deux autres manières différentes : la génération de cellules et les comparaisons peuvent être combinées en une seule étape, donc :

 

  eu2= : 4 : '($x.)(x.&-:);.3 y.'

 

De manière alternative, < ;.3 peut être utilisé à la place de

[ ;.3, et la comparaison qui la suit peut donc être (<x.)=blabla , donc :

 

  eu3= : 4 : '(<x.) = ($x.)<;.3 y.'

 

Cette dernière définition peut être écrite tacitement, simplement :

 

  13 : '(<x.) = ($x.)< ;.3 y.'

([: < [) = ([: $ [) < ;.3 ]

 

Je l'aurais personnellement écrite de la façon suivante :

 

  eu4= : <@[ = $@[<;.3 ]

---------------------------------------------

 

Ceci montre, si besoin était, la très grande clarté d'analyse et de conception de Roger Hui, moins parce qu'il a écrit l'interprète de J que par sa parfaite connaissance de l'essence même du langage.

 

D'autre part Roger Hui donne un « Cours de J », clair et concis, sur les étapes à suivre pour l'amélioration d'une fonction de sa forme explicite vers une forme tacite.