Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Why is it that

fun[x, y] /. fun[z__] :> z

leads to



Dot[x, y] /. Dot[z__] :> z



I want it to be


Makes no sense. How do I make it work like I think it should?

share|improve this question
I thought it was related to the attribute OneIdentity (or Flat) of Dot but I can't reproduce the behaviour using a custom head that has these attributes set. – Szabolcs Jan 24 '14 at 19:04
Yeah, I thought it was that too. But it turned out not to be. – QuantumDot Jan 24 '14 at 19:04
up vote 10 down vote accepted

The problem is that Dot[z__] is evaluated to z__

The solution:

 Dot[x, y] /. HoldPattern[Dot[z__]] :> z

Sequence[x, y]

share|improve this answer
Alternatives: Dot[x, y] /. Verbatim[Dot][z__] :> z and Dot[x, y] /. (p : Dot)[z__] :> z – Mr.Wizard Jan 25 '14 at 1:06

While this doesn't explain the behavior you notice (andre's answer does) and all the right methods have been covered here (See Mr.Wizard's alternatives), I found a nice work-around that will work with any Head (replace Dot with your Head of choice). Here it is:

Dot[x, y] /. z_Dot :> Sequence @@ z

(* Sequence[x, y] *)
share|improve this answer
This is a good alternative. Be aware that there is an evaluation difference that affects held expressions, e.g.: Hold[{Dot[x, y]}] /. z_Dot :> q[Sequence @@ z] (or more simply z_Dot :> q @@ z) versus Hold[{Dot[x, y]}] /. Verbatim[Dot][z__] :> q[z] – Mr.Wizard Jan 26 '14 at 22:53
@Mr.Wizard. Thanks, that's an interesting example and I guess one can always use Trott-Strzebonski to save the day Hold[{Dot[x, y]}] /. z_Dot :> With[{s = q[Sequence @@ z]}, s /; True] – RunnyKine Jan 26 '14 at 23:13
That is yet another evaluation sequence because you are inducing evaluation where there otherwise would be none. As a counterexample consider: Hold[{Dot[1, 2]}] /. Verbatim[Dot][z__] :> +z. I think you will find this hard to do in a single step using z_Dot :> . . .; in fact if you can I want to know about it because I can't think of a solution. – Mr.Wizard Jan 27 '14 at 4:09

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.