Foreach/3, foreach/4 are necessary?

According to help(foreach), there are foreach/3, and foreach/4 in addition to foreach/2, with a sample query:

?- phrase(foreach(between(1,5,X), number(X), ", "), L).

My impression is: Are foreach/3, and foreach/4 necessary ? Their semantics look too procedural compared with foreach/2. And foreach/2 already can do such a similar job.

comma_list_mem(X, X).
comma_list_mem(X, (X,_)).
comma_list_mem(X, (_,Y)):- comma_list_mem(X, Y).

% ?- foreach((between(1,3,X),number(X)), comma_list_mem(X, L)).
%@ L =  (1, 2, 3)

Of course, I do not insist, but just express first sight impression. There must be practical needs.

Don’t you mean foreach//2, foreach//3 ?

In a way, foreach//2 is like findall/3:

?- [user].
|: id(X) --> [X].
|: ^D% user://1 compiled 0.01 sec, 1 clauses
true.

?- phrase(foreach(between(1,5,X), id(X)), L).
L = [1, 2, 3, 4, 5].

?- findall(X, between(1,5,X), L).
L = [1, 2, 3, 4, 5].

Thanks. I ignored or forgot the meaning of //.