private Element Rearrange(AssignmentElement root, Element targetVar)
 {
     while (true)
     {
         // Check for no rearrange necessary
         if (root.Elements.Lhs == targetVar) return root.Elements.Rhs;
         // Rearrange first part of tree
         var targetPath = root.Elements.Lhs.FindPath(targetVar).ToArray();
         var lastOperation = targetPath.First();
         var varBranch = targetPath.Skip(1).FirstOrDefault() ?? targetVar;
         var newRoot = root.Replace(lastOperation, varBranch) as AssignmentElement;
         var inversion = lastOperation.Invert(varBranch, newRoot.Elements.Rhs);
         root = newRoot.Replace(newRoot.Elements.Rhs, inversion) as AssignmentElement;
     }
 }