- let are_alpha_eq cl1 cl2 =
- let get_term (_,lit,_,_) =
- match lit with
- | Terms.Predicate _ -> assert false
- | Terms.Equation (l,r,ty,_) ->
- Terms.Node [Terms.Leaf B.eqP; ty; l ; r]
+ let rec demodulate bag (id,nlit,plit,vl,proof) table =
+ let rec demod_lit ~jump_to_right bag id lit clause_ctx =
+ match demodulate_once ~jump_to_right bag id lit vl table clause_ctx with
+ | None -> bag, id, lit
+ | Some ((bag, id, lit),jump) ->
+ demod_lit ~jump_to_right:jump bag id lit clause_ctx
+ in
+ (*let cmp_bag,cmp_cl = match nlit,plit with
+ |[],[lit,_] ->
+ let bag, id, lit = demod_lit ~jump_to_right:false bag id lit (fun l -> nlit, [l,true])
+ in
+ let cl,_,_ = Terms.get_from_bag id bag in
+ bag,cl
+ |[lit,_],[] ->
+ let bag, id, lit = demod_lit ~jump_to_right:false bag id lit (fun l -> [l,true],[])
+ in
+ let cl,_,_ = Terms.get_from_bag id bag in
+ bag,cl
+ |_ -> assert false
+ in*)
+ let nlit,_,bag,id = if nlit = [] then nlit,[],bag,id
+ else List.fold_left
+ (fun (pre,post,bag,id) (lit,sel) ->
+ let bag, id, lit =
+ demod_lit ~jump_to_right:false bag id lit (fun l -> pre@[l,sel]@post,plit)
+ in
+ if post=[] then pre@[(lit,sel)],[],bag,id
+ else pre@[(lit,sel)],List.tl post,bag,id)
+ ([],List.tl nlit, bag, id) nlit