| Exact of Cic.term
| Step of Subst.substitution * (rule * int*(Utils.pos*int)* Cic.term)
(* subst, (rule,eq1, eq2,predicate) *)
-and goal_proof = (Utils.pos * int * Subst.substitution * Cic.term) list
+and goal_proof = (rule * Utils.pos * int * Subst.substitution * Cic.term) list
;;
(* globals *)
let open_equality (_,weight,proof,(ty,l,r,o),m,id) =
(weight,proof,(ty,l,r,o),m,id)
+let string_of_rule = function
+ | SuperpositionRight -> "SupR"
+ | SuperpositionLeft -> "SupL"
+ | Demodulation -> "Demod"
+;;
+
let string_of_equality ?env eq =
match env with
| None ->
let string_of_proof ?(names=[]) p gp =
- let str_of_rule = function
- | SuperpositionRight -> "SupR"
- | SuperpositionLeft -> "SupL"
- | Demodulation -> "Demod"
- in
let str_of_pos = function
| Utils.Left -> "left"
| Utils.Right -> "right"
prefix (CicPp.pp t names)
| Step (subst,(rule,eq1,(pos,eq2),pred)) ->
Printf.sprintf "%s%s(%s|%d with %d dir %s pred %s))\n"
- prefix (str_of_rule rule) (Subst.ppsubst ~names subst) eq1 eq2 (str_of_pos pos)
+ prefix (string_of_rule rule) (Subst.ppsubst ~names subst) eq1 eq2 (str_of_pos pos)
(CicPp.pp pred names)^
aux (margin+1) (Printf.sprintf "%d" eq1) (fst3 (proof_of_id eq1)) ^
aux (margin+1) (Printf.sprintf "%d" eq2) (fst3 (proof_of_id eq2))
aux 0 "" p ^
String.concat "\n"
(List.map
- (fun (pos,i,s,t) ->
+ (fun (r,pos,i,s,t) ->
(Printf.sprintf
- "GOAL: %s %d %s %s\n"
+ "GOAL: %s %s %d %s %s\n" (string_of_rule r)
(str_of_pos pos) i (Subst.ppsubst ~names s) (CicPp.pp t names)) ^
aux 1 (Printf.sprintf "%d " i) (fst3 (proof_of_id i)))
gp)
;;
-let rec depend eq id =
+let rec depend eq id seen =
let (_,p,(_,_,_,_),_,ideq) = open_equality eq in
- if id = ideq then true else
- match p with
- Exact _ -> false
- | Step (_,(_,id1,(_,id2),_)) ->
- let eq1 = Hashtbl.find id_to_eq id1 in
- let eq2 = Hashtbl.find id_to_eq id2 in
- depend eq1 id || depend eq2 id
+ if List.mem ideq seen then
+ false,seen
+ else
+ if id = ideq then
+ true,seen
+ else
+ match p with
+ | Exact _ -> false,seen
+ | Step (_,(_,id1,(_,id2),_)) ->
+ let seen = ideq::seen in
+ let eq1 = Hashtbl.find id_to_eq id1 in
+ let eq2 = Hashtbl.find id_to_eq id2 in
+ let b1,seen = depend eq1 id seen in
+ if b1 then b1,seen else depend eq2 id seen
;;
+let depend eq id = fst (depend eq id []);;
+
let ppsubst = Subst.ppsubst ~names:[];;
(* returns an explicit named subst and a list of arguments for sym_eq_URI *)
| _ -> assert false
;;
+let open_sym ens tl =
+ let args = List.map snd ens @ tl in
+ match args with
+ | [ty;l;r;p] -> ty,l,r,p
+ | _ -> assert false
+;;
+
let open_eq_ind args =
match args with
| [ty;l;pred;pl;r;pleqr] -> ty,l,pred,pl,r,pleqr
* ctx is a term with an open (Rel 1). (Rel 1) is the empty context
*)
let rec aux uri ty left right ctx_d = function
+ | Cic.Appl ((Cic.Const(uri_sym,ens))::tl)
+ when LibraryObjects.is_sym_eq_URI uri_sym ->
+ let ty,l,r,p = open_sym ens tl in
+ mk_sym uri_sym ty l r (aux uri ty l r ctx_d p)
| Cic.LetIn (name,body,rest) ->
(* we should go in body *)
Cic.LetIn (name,body,aux uri ty left right ctx_d rest)
contextualize eq ty l r t
;;
-let build_proof_step lift subst p1 p2 pos l r pred =
+let build_proof_step ?(sym=false) lift subst p1 p2 pos l r pred =
let p1 = Subst.apply_subst_lift lift subst p1 in
let p2 = Subst.apply_subst_lift lift subst p2 in
let l = CicSubstitution.lift lift l in
let what, other =
if pos = Utils.Left then l,r else r,l
in
+ let p =
match pos with
| Utils.Left ->
mk_eq_ind (Utils.eq_ind_URI ()) ty what pred p1 other p2
| Utils.Right ->
mk_eq_ind (Utils.eq_ind_r_URI ()) ty what pred p1 other p2
+ in
+ if sym then
+ let uri,pl,pr =
+ let eq,_,pl,pr = open_eq body in
+ LibraryObjects.sym_eq_URI ~eq, pl, pr
+ in
+ let l = CicSubstitution.subst other pl in
+ let r = CicSubstitution.subst other pr in
+ mk_sym uri ty l r p
+ else
+ p
;;
let parametrize_proof p l r ty =
let p = CicSubstitution.lift (lift_no-1) p in
let p =
ProofEngineReduction.replace_lifting
- ~equality:(fun t1 t2 -> match t1,t2 with Cic.Meta (i,_),Cic.Meta(j,_) -> i=j | _ -> false) ~what ~with_what ~where:p
+ ~equality:(fun t1 t2 ->
+ match t1,t2 with Cic.Meta (i,_),Cic.Meta(j,_) -> i=j | _ -> false)
+ ~what ~with_what ~where:p
in
let ty_of_m _ = ty (*function
| Cic.Meta (i,_) -> List.assoc i menv
proof, instance
;;
-let wfo goalproof proof =
+let wfo goalproof proof id =
let rec aux acc id =
let p,_,_ = proof_of_id id in
match p with
in
let acc =
match proof with
- | Exact _ -> []
- | Step (_,(_,id1, (_,id2), _)) -> aux (aux [] id1) id2
+ | Exact _ -> [id]
+ | Step (_,(_,id1, (_,id2), _)) -> aux (aux [id] id1) id2
in
- List.fold_left (fun acc (_,id,_,_) -> aux acc id) acc goalproof
+ List.fold_left (fun acc (_,_,id,_,_) -> aux acc id) acc goalproof
;;
let string_of_id names id =
+ if id = 0 then "" else
try
let (_,p,(_,l,r,_),m,_) = open_equality (Hashtbl.find id_to_eq id) in
match p with
(String.concat ", " (List.map (fun (i,_,_) -> string_of_int i) m))
| Step (_,(step,id1, (_,id2), _) ) ->
Printf.sprintf "%6d: %s %6d %6d %s = %s [%s]" id
- (if step = SuperpositionRight then "SupR" else "Demo")
+ (string_of_rule step)
id1 id2 (CicPp.pp l names) (CicPp.pp r names)
(String.concat ", " (List.map (fun (i,_,_) -> string_of_int i) m))
with
Not_found -> assert false
-let pp_proof names goalproof proof =
- String.concat "\n" (List.map (string_of_id names) (wfo goalproof proof)) ^
- "\ngoal is demodulated with " ^
- (String.concat " "
- ((List.map (fun (_,i,_,_) -> string_of_int i) goalproof)))
+let pp_proof names goalproof proof subst id initial_goal =
+ String.concat "\n" (List.map (string_of_id names) (wfo goalproof proof id)) ^
+ "\ngoal:\n " ^
+ (String.concat "\n "
+ (fst (List.fold_right
+ (fun (r,pos,i,s,pred) (acc,g) ->
+ let _,_,left,right = open_eq g in
+ let ty =
+ match pos with
+ | Utils.Left -> CicReduction.head_beta_reduce (Cic.Appl[pred;right])
+ | Utils.Right -> CicReduction.head_beta_reduce (Cic.Appl[pred;left])
+ in
+ let ty = Subst.apply_subst s ty in
+ ("("^ string_of_rule r ^ " " ^ string_of_int i^") -> "
+ ^ CicPp.pp ty names) :: acc,ty) goalproof ([],initial_goal)))) ^
+ "\nand then subsumed by " ^ string_of_int id ^ " when " ^ Subst.ppsubst subst
;;
(* returns the list of ids that should be factorized *)
match p with
| Exact _ -> true
| _ ->
- try let (pos,no) = Hashtbl.find h i in Hashtbl.replace h i (pos,no+1);false
+ try
+ let (pos,no) = Hashtbl.find h i in
+ Hashtbl.replace h i (pos,no+1);
+ false
with Not_found -> Hashtbl.add h i (n,1);true
in
let rec aux n = function
let i = aux 0 p in
let _ =
List.fold_left
- (fun acc (_,id,_,_) -> aux acc (let p,_,_ = proof_of_id id in p))
+ (fun acc (_,_,id,_,_) -> aux acc (let p,_,_ = proof_of_id id in p))
i ol
in
(* now h is complete *)
in
let rec aux = function
| Exact term -> CicSubstitution.lift lift term
- | Step (subst,(_, id1, (pos,id2), pred)) ->
- if Subst.is_in_subst 302 subst then
- prerr_endline ("TROVATA in " ^ string_of_int id1 ^ " " ^ string_of_int id2);
-
+ | Step (subst,(rule, id1, (pos,id2), pred)) ->
let p1,_,_ = proof_of_id aux id1 in
let p2,l,r = proof_of_id aux id2 in
+ let varname =
+ match rule with
+ | SuperpositionRight -> Cic.Name ("SupR" ^ Utils.string_of_pos pos)
+ | Demodulation -> Cic.Name ("DemEq"^ Utils.string_of_pos pos)
+ | _ -> assert false
+ in
+ let pred =
+ match pred with
+ | Cic.Lambda (_,a,b) -> Cic.Lambda (varname,a,b)
+ | _ -> assert false
+ in
let p = build_proof_step lift subst p1 p2 pos l r pred in
(* let cond = (not (List.mem 302 (Utils.metas_of_term p)) || id1 = 8 || id1 = 132) in
if not cond then
let proof,se =
let rec aux se current_proof = function
| [] -> current_proof,se
- | (pos,id,subst,pred)::tl ->
- if Subst.is_in_subst 302 subst then
- prerr_endline ("TROVATA in " ^ string_of_int id );
-
+ | (rule,pos,id,subst,pred)::tl ->
let p,l,r = proof_of_id id in
let p = build_proof_term h letsno p in
let pos = if pos = Utils.Left then Utils.Right else Utils.Left in
+ let varname =
+ match rule with
+ | SuperpositionLeft -> Cic.Name ("SupL" ^ Utils.string_of_pos pos)
+ | Demodulation -> Cic.Name ("DemG"^ Utils.string_of_pos pos)
+ | _ -> assert false
+ in
+ let pred =
+ match pred with
+ | Cic.Lambda (_,a,b) -> Cic.Lambda (varname,a,b)
+ | _ -> assert false
+ in
let proof =
- build_proof_step letsno subst current_proof p pos l r pred
+ build_proof_step letsno subst current_proof p pos l r pred
in
let proof,se = aux se proof tl in
Subst.apply_subst_lift letsno subst proof,
cic, p))
lets (letsno-1,initial)
in
- (*canonical (contextualize_rewrites proof (CicSubstitution.lift letsno ty))*)proof, se
+ canonical (contextualize_rewrites proof (CicSubstitution.lift letsno ty)),
+ se
;;
let refl_proof ty term =
menv (argsno, t))
;;
+let symmetric eq_ty l id uri m =
+ let eq = Cic.MutInd(uri,0,[]) in
+ let pred =
+ Cic.Lambda (Cic.Name "Sym",eq_ty,
+ Cic.Appl [CicSubstitution.lift 1 eq ;
+ CicSubstitution.lift 1 eq_ty;
+ Cic.Rel 1;CicSubstitution.lift 1 l])
+ in
+ let prefl =
+ Exact (Cic.Appl
+ [Cic.MutConstruct(uri,0,1,[]);eq_ty;l])
+ in
+ let id1 =
+ let eq = mk_equality (0,prefl,(eq_ty,l,l,Utils.Eq),m) in
+ let (_,_,_,_,id) = open_equality eq in
+ id
+ in
+ Step(Subst.empty_subst,
+ (Demodulation,id1,(Utils.Left,id),pred))
+;;
+