type position = int list
type 'a proof =
- | Exact of 'a
+ | Exact of 'a foterm
+ (* for theorems like T : \forall x. C[x] = D[x] the proof is
+ * a foterm like (Node [ Leaf T ; Var i ]), while for the Goal
+ * it is just (Var g), i.e. the identity proof *)
| Step of rule * int * int * direction * position * 'a substitution
(* rule, eq1, eq2, direction of eq2, position, substitution *)
type t
val eq : t -> t -> bool
val compare : t -> t -> int
+ val is_eq_predicate : t -> bool
(* TODO: consider taking in input an imperative buffer for Format
* val pp : Format.formatter -> t -> unit
* *)
val pp : t -> string
- val embed : t -> t foterm * int list
+ val embed : t -> t foterm
+ (* saturate [proof] [type] -> [proof] * [type] *)
+ val saturate : t -> t -> t foterm * t foterm
end
-module Utils (B : Blob) :
- sig
- val eq_foterm : B.t foterm -> B.t foterm -> bool
- val compare_foterm : B.t foterm -> B.t foterm -> int
-
- val eq_literal : B.t literal -> B.t literal -> bool
- val compare_literal : B.t literal -> B.t literal -> int
-
- val eq_unit_clause : B.t unit_clause -> B.t unit_clause -> bool
- val compare_unit_clause : B.t unit_clause -> B.t unit_clause -> int
- end