3

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?

m_goldberg
  • 107,779
  • 16
  • 103
  • 257
QuantumDot
  • 19,601
  • 7
  • 45
  • 121

2 Answers2

10

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

The solution:

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

Sequence[x, y]

andre314
  • 18,474
  • 1
  • 36
  • 69
1

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] *)
RunnyKine
  • 33,088
  • 3
  • 109
  • 176
  • 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 04:09