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
  )