Bonsoir ou bonjour,

Cette petite fonction (S)ML ajoute un élément à une liste, mais ne l’ajoute que s’il n’y existe pas déjà.

Code:
fun
  add (nil, e) = e :: nil
| add (l as head :: tail, e) =
    if head = e then l
    else head :: add (tail, e);
Ça marche, mais je l’écrirais intuitivement encore plutôt de cette manière :

Code:
fun
  add (nil, e) = e :: nil
| add (l as e :: tail, e) = l
| add (l as head :: tail, e) = head :: add (tail, e);
Malheureusement, ça ne marche pas, parce que dans

Code:
| add (l as e :: tail, e) = l
“e” apparait deux fois, ce qui n’est pas permis, comme le rappel l’interpréteur.

Ceci montre une limite du pattern matching de ML comparé à celui de Prolog.

Je me demandais pourquoi il n’est pas permis d’avoir

Code:
| add (l as e :: tail, e) = l
Est-ce que ce sont des raisons logiques ou seulement des raisons techniques qui ont motivés ce choix pour la spécification de ML ?

Existe-t-il un langage similaire à ML qui permet cela ?

Existe t-il des documents faisant une comparaison de Prolog (ou du pattern matching à proprement parler) et de ML ? J’ai cherché, mais sans succès : pas de document à ce sujet sur le net.