In reply to Shubhabrata:
b[=1] // is equivalent to:
!b[*0:$] ##1 b ##1 !b[*0:$]
b[=0:1] ##1 a; // is equivalent to
b ##1 !b[*0:$] ##1 a or // because of the empty match !b[*0] ##1 b ##1 !b[*0:$]
!b[*1] ##1 b ##1 !b[*0:$] ##1 a
THus, !a |-> b[=0:1] ##1 a; requires that b appears either immediately or later on.