- if Formula.infer_form set qf qn form
- then if StateSet.mem q set
- then comp_acc_self set 0 tl
- else comp_acc_self (StateSet.add q set) 1 tl
- else comp_acc_self set 0 tl
- and rec fix_point selfq_i =
- let setq,flag = comp_acc_self selfq_i 0 list_tr in
- if flag = 1 then set
- else fix_point setq qf qn 0 in
- NodeHash.replace run node (fix_point set_node, set_nr);
+ if (StateSet.mem q self_q)
+ then begin
+ let q_cand,_,_ = Formula.st form in
+ StateSet.iter (fun x -> Queue.push x queue) q_cand;
+ result_q (StateSet.add q self_q) queue tl;
+ end
+ else result_q self_q queue tl
+ and result_st_q self_q queue flag = function (*for computing the fixed p*)
+ | [] -> flag,queue
+ | form :: tl ->
+ if Formula.infer_form (self_q,self_r) qf qn form hashInfer
+ then begin
+ let q_cand,_,_ = Formula.st form in
+ StateSet.iter (fun x -> Queue.push x queue) q_cand;
+ result_st_q self_q queue 1 tl;
+ end
+ else result_st_q self_q queue flag tl in
+ let rec comp_acc_self self_q_i queue = (* compute the fixed point *)
+ if Queue.is_empty queue (* todo: to be hconsigned? *)
+ then self_q_i
+ else
+ let q = Queue.pop queue in
+ let list_q,_ = Asta.transitions_st_lab asta q lab in
+ let flag,queue = result_st_q self_q_i queue 0 list_q in
+ let self_q = if flag = 1 then StateSet.add q self_q_i else self_q_i in
+ comp_acc_self self_q queue in