Type Inference

We use a kind of Hindley-Milner algorithm to infer types. Two main constraints are to be respected:

  • compatibility with TPTP (THF/TFF1), which forces parametric polymorphism
  • flexibility for the meta-prover

We also have interesting extensions such as extensible records.

Sketch of the algorithm

The algorithm takes as input a PrologTerm.t, i.e. an unscoped, untyped AST with some annotations (PrologTerm.Column (t,ty)) and a signature. The signature is used (and updated) to map constants to their types.

Only declared constants can be polymorphic, because when we meet a new symbol (or a variable) that is applied to arguments, there is no syntactic way to know which arguments are terms and which are types. Therefore they are all assumed to be terms unless the signature specifies the converse explicitely.

For HOTerm inference, application is left-parenthesed, so when a symbol requires n type arguments and m term arguments, we assume the n first arguments to be types.