Hashtbl.Make (
struct
type t = literal
let equal (literal1: literal) (literal2: literal) : bool =
(literal1.sign == literal2.sign)
&&
match literal1.atom, literal2.atom with
| Func func1(*(symbol1, _, _)*), Func func2(*(symbol2, _, _)*) ->
(* same predicate symbol *)
Symbol.equal func1.symbol func2.symbol
| _ ->
(* or for var/const same term *)
literal1.atom == literal2.atom
let hash (literal: literal) : int =
match literal.atom with
| Const symbol
| Func { symbol = symbol } (*(symbol, _, _)*) ->
Symbol.id symbol
| Var var ->
Var.hash_of_var var
end
)