Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Why is it that

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

leads to

Sequence[x,y]

but

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

gives

Dot[x,y]

I want it to be

Sequence[x,y]

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 at 19:04
    
Yeah, I thought it was that too. But it turned out not to be. –  QuantumDot Jan 24 at 19:04
    
add comment

2 Answers

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
1  
Alternatives: Dot[x, y] /. Verbatim[Dot][z__] :> z and Dot[x, y] /. (p : Dot)[z__] :> z –  Mr.Wizard Jan 25 at 1:06
add comment

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 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 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 at 4:09
add comment

Your Answer

 
discard

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.