+ list_first
+ (fun (dir, (id,lit,vl,_)) ->
+ match lit with
+ | Terms.Predicate _ -> assert false
+ | Terms.Equation (l,r,_,o) ->
+ let side, newside = if dir=Terms.Left2Right then l,r else r,l in
+ try
+ let subst =
+ prof_demod_u.HExtlib.profile
+ (Unif.unification (* (varlist@vl) *) varlist subterm) side
+ in
+ let iside =
+ prof_demod_s.HExtlib.profile
+ (Subst.apply_subst subst) side
+ in
+ let inewside =
+ prof_demod_s.HExtlib.profile
+ (Subst.apply_subst subst) newside
+ in
+ if o = Terms.Incomparable || o = Terms.Invertible then
+ let o =
+ prof_demod_o.HExtlib.profile
+ (Order.compare_terms inewside) iside in
+ (* Riazanov, pp. 45 (ii) *)
+ if o = Terms.Lt then
+ Some (newside, subst, id, dir)
+ else
+ ((*prerr_endline ("Filtering: " ^
+ Pp.pp_foterm side ^ " =(< || =)" ^
+ Pp.pp_foterm newside ^ " coming from " ^
+ Pp.pp_unit_clause uc );*)None)
+ else
+ Some (newside, subst, id, dir)
+ with FoUnif.UnificationFailure _ -> None)
+ (IDX.ClauseSet.elements cands)
+ ;;
+
+ let ctx_demod table vl bag t pos ctx id =
+ match mydemod table vl t with
+ | None -> (bag,[],t,id)
+ | Some (newside, subst, id2, dir) ->
+ let inewside = Subst.apply_subst subst newside in
+ match build_clause bag (fun _ -> true)
+ Terms.Demodulation (ctx inewside) subst id id2 pos dir
+ with
+ | None -> assert false
+ | Some (bag,(id,_,_,_)) ->
+ (bag,subst,newside,id)
+ ;;
+
+ let rec demodulate ~jump_to_right bag (id, literal, vl, pr) table =
+ match literal with
+ | Terms.Predicate t -> assert false
+ | Terms.Equation (l,r,ty,_) ->
+ let bag,l,id1 =
+ visit bag [2]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ]) id l
+ (ctx_demod table vl)
+ in
+ let bag,_,id2 =
+ visit bag [3]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ]) id1 r
+ (ctx_demod table vl)
+ in
+ let cl,_,_ = Terms.get_from_bag id2 bag in
+ bag,cl
+ ;;
+
+
+ let demodulate_once_old ~jump_to_right bag (id, literal, vl, pr) table =
+ match literal with
+ | Terms.Predicate t -> assert false
+ | Terms.Equation (l,r,ty,_) ->
+ let left_position = if jump_to_right then None else
+ first_position [2]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ]) l
+ (demod table vl)
+ in
+ match left_position with
+ | Some (newt, subst, id2, dir, pos) ->
+ begin
+ match build_clause bag (fun _ -> true) Terms.Demodulation
+ newt subst id id2 pos dir
+ with
+ | None -> assert false
+ | Some x -> Some (x,false)
+ end
+ | None ->
+ match first_position
+ [3] (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ]) r
+ (demod table vl)
+ with
+ | None -> None
+ | Some (newt, subst, id2, dir, pos) ->
+ match build_clause bag (fun _ -> true)
+ Terms.Demodulation newt subst id id2 pos dir
+ with
+ | None -> assert false
+ | Some x -> Some (x,true)
+ ;;
+
+ let parallel_demod table vl bag t pos ctx id =
+ match demod table vl t with
+ | None -> (bag,t,id)
+ | Some (newside, subst, id2, dir) ->
+ match build_clause bag (fun _ -> true)
+ Terms.Demodulation (ctx newside) subst id id2 pos dir
+ with
+ | None -> assert false
+ | Some (bag,(id,_,_,_)) ->
+ (bag,newside,id)
+ ;;
+
+ let demodulate_once ~jump_to_right bag (id, literal, vl, pr) table =
+ match literal with
+ | Terms.Predicate t -> assert false
+ | Terms.Equation (l,r,ty,_) ->
+ let bag,l,id1 = if jump_to_right then (bag,l,id) else
+ parallel_positions bag [2]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ]) id l
+ (parallel_demod table vl)
+ in
+ let jump_to_right = id1 = id in
+ let bag,r,id2 =
+ parallel_positions bag [3]
+ (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ]) id1 r
+ (parallel_demod table vl)
+ in
+ if id = id2 then None
+ else
+ let cl,_,_ = Terms.get_from_bag id2 bag in
+ Some ((bag,cl),jump_to_right)