--- /dev/null
+
+(* NOTATION *)
+
+let symbol_table = Hashtbl.create 503 ;;
+let lookup_symbol = Hashtbl.find symbol_table ;;
+
+let idref id t = CicAst.AttributedTerm (`IdRef id, t) ;;
+
+let add_symbol uri mnemonic =
+ Hashtbl.add symbol_table uri
+ (fun aid sid args ast_of_acic ->
+ idref aid (CicAst.Appl
+ (idref sid (CicAst.Symbol (mnemonic, 0)) :: List.map ast_of_acic args)))
+;;
+
+(* eq *)
+Hashtbl.add symbol_table "cic:/Coq/Init/Logic/eq.ind#xpointer(1/1)"
+ (fun aid sid args ast_of_acic ->
+ idref aid (CicAst.Appl
+ (idref sid (CicAst.Symbol ("eq", 0)) ::
+ List.map ast_of_acic (List.tl args)))) ;;
+Hashtbl.add symbol_table "cic:/Coq/Init/Logic_Type/eqT.ind#xpointer(1/1)"
+ (fun aid sid args ast_of_acic ->
+ idref aid (CicAst.Appl
+ (idref sid (CicAst.Symbol ("eq", 0)) ::
+ List.map ast_of_acic (List.tl args)))) ;;
+
+(* and *)
+add_symbol "cic:/Coq/Init/Logic/and.ind#xpointer(1/1)" "and" ;;
+
+(* or *)
+add_symbol "cic:/Coq/Init/Logic/or.ind#xpointer(1/1)" "or" ;;
+
+(* iff *)
+add_symbol "cic:/Coq/Init/Logic/iff.con" "iff" ;;
+
+(* not *)
+add_symbol "cic:/Coq/Init/Logic/not.con" "not" ;;
+
+(* Rinv *)
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rinv.con" "inv" ;;
+
+(* Ropp *)
+add_symbol "cic:/Coq/Reals/Rdefinitions/Ropp.con" "opp" ;;
+
+(* exists *)
+Hashtbl.add symbol_table "cic:/Coq/Init/Logic/ex.ind#xpointer(1/1)"
+ (fun aid sid args ast_of_acic ->
+ match (List.tl args) with
+ [Cic.ALambda (_,n,s,t)] ->
+ idref aid
+ (CicAst.Binder (`Exists, (n, Some (ast_of_acic s)), ast_of_acic t))
+ | _ -> raise Not_found);;
+Hashtbl.add symbol_table "cic:/Coq/Init/Logic_Type/exT.ind#xpointer(1/1)"
+ (fun aid sid args ast_of_acic ->
+ match (List.tl args) with
+ [Cic.ALambda (_,n,s,t)] ->
+ idref aid
+ (CicAst.Binder (`Exists, (n, Some (ast_of_acic s)), ast_of_acic t))
+ | _ -> raise Not_found);;
+
+(* leq *)
+add_symbol "cic:/Coq/Init/Peano/le.ind#xpointer(1/1)" "leq" ;;
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rle.con" "leq" ;;
+
+(* lt *)
+add_symbol "cic:/Coq/Init/Peano/lt.con" "lt" ;;
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rlt.con" "lt" ;;
+
+(* geq *)
+add_symbol "cic:/Coq/Init/Peano/ge.con" "geq" ;;
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rge.con" "geq" ;;
+
+(* gt *)
+add_symbol "cic:/Coq/Init/Peano/gt.con" "gt" ;;
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rgt.con" "gt" ;;
+
+(* plus *)
+add_symbol "cic:/Coq/Init/Peano/plus.con" "plus" ;;
+add_symbol "cic:/Coq/ZArith/fast_integer/Zplus.con" "plus" ;;
+
+let rplus_uri =
+ UriManager.uri_of_string "cic:/Coq/Reals/Rdefinitions/Rplus.con" ;;
+let r1_uri = UriManager.uri_of_string "cic:/Coq/Reals/Rdefinitions/R1.con" ;;
+
+Hashtbl.add symbol_table "cic:/Coq/Reals/Rdefinitions/Rplus.con"
+ (fun aid sid args ast_of_acic ->
+ let appl () =
+ idref aid (CicAst.Appl
+ (idref sid (CicAst.Symbol ("plus", 0)) :: List.map ast_of_acic args))
+ in
+ let rec aux acc = function
+ | [ Cic.AConst (nid, uri, []); n] when UriManager.eq uri r1_uri ->
+ (match n with
+ | Cic.AConst (_, uri, []) when UriManager.eq uri r1_uri ->
+ idref aid (CicAst.Num (string_of_int (acc+2), 0))
+ | Cic.AAppl (_, Cic.AConst (_, uri, []) :: args)
+ when UriManager.eq uri rplus_uri ->
+ aux (acc + 1) args
+ | _ -> appl ())
+ | _ -> appl ()
+ in
+ aux 0 args)
+;;
+
+(* zero and one *)
+Hashtbl.add symbol_table "cic:/Coq/Reals/Rdefinitions/R0.con"
+ (fun _ sid _ _ -> idref sid (CicAst.Num ("0", 0))) ;;
+Hashtbl.add symbol_table "cic:/Coq/Reals/Rdefinitions/R1.con"
+ (fun _ sid _ _ -> idref sid (CicAst.Num ("1", 0))) ;;
+
+(* times *)
+add_symbol "cic:/Coq/Init/Peano/mult.con" "times" ;;
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rmult.con" "times" ;;
+
+(* minus *)
+add_symbol "cic:/Coq/Arith/Minus/minus.con" "minus" ;;
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rminus.con" "minus" ;;
+
+(* div *)
+add_symbol "cic:/Coq/Reals/Rdefinitions/Rdiv.con" "div" ;;
+