+ let ctx_demod table vl clause_ctx bag t pos ctx id lit =
+ match mydemod table vl t with
+ | None -> (bag,[],t,id,lit)
+ | Some (newside, subst, id2, dir) ->
+ let inewside = Subst.apply_subst subst newside in
+ match build_clause ~fresh:false bag 0 (fun _ -> true)
+ Terms.Demodulation (ctx inewside) subst id id2 pos dir clause_ctx
+ with
+ | None -> assert false
+ | Some (bag,_,(id,_,_,_,_),lit) ->
+ (bag,subst,newside,id,lit)
+ ;;
+
+ let rec demodulate bag (id,nlit,plit,vl,proof) table =
+ let rec demod_lit ~jump_to_right bag id lit clause_ctx =
+ (match lit with
+ | Terms.Predicate t -> assert false
+ | Terms.Equation (l,r,ty,_) -> assert false
+ (*let bag,l,id1,lit =
+ visit bag [2]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ]) id lit l
+ (ctx_demod table vl clause_ctx)
+ in
+ let bag,_,id2,lit =
+ visit bag [3]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ]) id1 lit r
+ (ctx_demod table vl clause_ctx)
+ in
+ let cl,_,_ = Terms.get_from_bag id2 bag in
+ bag,id2,cl *) )
+ 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
+ in
+ let _,_,bag,id = if plit = [] then plit,[],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 -> nlit,pre@[l,sel]@post)
+ in
+ if post=[] then pre@[(lit,sel)],[],bag,id
+ else pre@[(lit,sel)],List.tl post,bag,id)
+ ([],List.tl plit, bag, id) plit
+ in
+ let cl,_,_ = Terms.get_from_bag id bag in
+ bag,cl
+ ;;
+
+ let parallel_demod table vl clause_ctx bag t pos ctx id lit =
+ match demod table vl t with
+ | None -> (bag,t,id,lit)
+ | Some (newside, subst, id2, dir) ->
+ match build_clause ~fresh:false bag 0 (fun _ -> true)
+ Terms.Demodulation (ctx newside) subst id id2 pos dir clause_ctx
+ with
+ | None -> assert false
+ | Some (bag,_,(id,_,_,_,_),lit) ->
+ (bag,newside,id,lit)
+ ;;
+
+ let demodulate_once ~jump_to_right bag id literal vl table clause_ctx =