+
+
+ let rec accepting_among a t r =
+ let orig = r in
+ let rest = Ptset.inter r a.final in
+ let r = Ptset.diff r rest in
+ if Ptset.is_empty r then rest,TS.empty else
+ if Tree.is_node t
+ then
+ let (r1,r2),formula,mark,has_true,r = get_trans t a (Tree.tag t) r
+ in
+ let s1,res1 = accepting_among a (Tree.first_child t) r1
+ and s2,res2 = accepting_among a (Tree.next_sibling t) r2
+ in
+ let rb,rb1,rb2 = eval_form_bool formula s1 s2 in
+ if rb
+ then
+ let res1 = if rb1 then res1 else TS.empty
+ and res2 = if rb2 then res2 else TS.empty
+ in r, TS.concat res2 (if mark then TS.cons t res1 else res1)
+ else orig,TS.empty
+ else orig,TS.empty
+
+
+
+
+ let rec accepting_count a t r =
+ let orig = r in
+ let rest = Ptset.inter r a.final in
+ let r = Ptset.diff r rest in
+ if Ptset.is_empty r then rest,0 else
+ if Tree.is_node t
+ then
+ let (r1,r2),formula,mark,has_true,r = get_trans t a (Tree.tag t) r
+ in
+ let s1,res1 = accepting_count a (Tree.first_child t) r1
+ and s2,res2 = accepting_count a (Tree.next_sibling t) r2
+ in
+ let rb,rb1,rb2 = eval_form_bool formula s1 s2 in
+ if rb
+ then
+ let res1 = if rb1 then res1 else 0
+ and res2 = if rb2 then res2 else 0
+ in r, res1+res2+(if mark then 1 else 0)
+ else orig,0
+ else orig,0
+