gvprプログラムのN節の述部の!

題記そのままの事柄についてである。
一部のノードに対して属性aが設定されたグラフを次のようなgvprプログラムに与える。

$ gvpr "
> N [a] {
>   print('[a]  ', name, ' has attrib a=', a);
> }
>
> N [!a] {
>   print('[!a] ', name, ' doesn\'t have attrib a');
> }
>
> N {
>   print('     ', name, ' is a node');
> }
>
> " << foo
> graph {
>   a [a=1];
>   b [a=2];
>   c;
>   d [a=0];
>   e [a=""];
>   f [a=null];
> }
> foo
[a]  a has attrib a=1
     a is a node
[a]  b has attrib a=2
     b is a node
[!a] c doesn't have attrib a
     c is a node
     d is a node
[!a] e doesn't have attrib a
     e is a node
[a]  f has attrib a=null
     f is a node

属性aが与えられていないノードcやeは述部が !a のN節のアクションをキックする。
注目すべきは属性aの値が0の場合である。
このノードは述部が a のN節にも !a のN節にも引っ掛からない。
値が0の属性aはaでも!aでもないということになる。
もちろん、aの値が0であることから、

$ gvpr "
> N [a == 0] {
>   print('[a == 0]  ', name, ' has attrib a=', a);
> }
>
> N [a != 0] {
>   print('[a != 0]  ', name, ' has attrib a=', a);
> }
>
> " << bar
> graph {
>   a [a=1];
>   b [a=2];
>   c;
>   d [a=0];
>   e [a=""];
>   f [a=null];
> }
> bar
[a != 0]  a has attrib a=1
[a != 0]  b has attrib a=2
[a == 0]  c has attrib a=
[a == 0]  d has attrib a=0
[a == 0]  e has attrib a=
[a != 0]  f has attrib a=null

のように、ノードdは確かに述部a == 0のアクションを呼び出す。
ただし、今度は属性aを持たないノードcやノードeもこれに反応してしまう。