.include everything

se( l:node )
se( l ) :- stmt(l).
se( l ) :- exp(l).

anc( a:node, c:node )
anc( a, c ) :- parent( a, c ).
anc( a, c ) :- anc( a, b ), parent( b, c ).

parent_noloop( p:node, c:node )
parent_noloop( p, c ) :- \
    parent(p,c), se(p), se(c), \
    !loop( p, *, * ), \
    !loop( c, *, * ).

#ancestor without loop in path
anc_noloop( a:node, c:node )
anc_noloop( a, c ) :- parent_noloop( a,c ).
anc_noloop( a, c ) :- anc_noloop(a,b), parent_noloop( b,c ).

grandparent( g:node, c:node ) 
grandparent( g, c )  :- parent(p,c), parent(g,p).

symbol_decl( S:node, D:node )
symbol_decl( S, D ) :- iname(I,_,S,_), parent(D,I), varD(D).  

cfg_path( s:node, si:number, t:node, ti:number )
cfg_path( s, _, t, _ ) :- s=t.
cfg_path( s, si, t, ti ) :- \
    cfgNext(s,si,t,ti).
cfg_path( s, si, t, ti ) :- \
    cfgNext(s,si,m,mi), \
    cfg_path(m,mi,t,ti).


