diff --git a/src/kernel/unification_constraint.h b/src/kernel/unification_constraint.h index 14d3ab9a02..14dd37b780 100644 --- a/src/kernel/unification_constraint.h +++ b/src/kernel/unification_constraint.h @@ -19,17 +19,20 @@ class unification_constraint; 1- ctx |- t == s t is (definitionally) equal to s 2- ctx |- t << s t is convertible to s (this is weaker than equality) - 3- ctx |- max(t1, t2) == s The maximum of t1 and t2 is equal to s + 3- ctx |- max(t1, t2) == s The maximum of t1 and t2 is equal to s, if t2 is Bool, then s is Bool. 4- ctx |- ?m == t_1 Or ... Or ?m == t_k The metavariable ?m is equal to t_1, ..., or t_k \remark The constraint ctx |- t == s implies that ctx |- t << s, but the converse is not true. Example: ctx |- Type 1 << Type 2, but we don't have ctx |- Type 1 == Type 2. - \remark In the max constraint, \c t1 and \c t2 must be eventually unifiable with a Type term. + \remark In the max constraint, \c t1 and \c t2 must be eventually unifiable with a Type term or Bool. For example, assume the constraint ctx |- max(?m1, Type 1) == ?m2. Now, suppose ?m2 is assigned to Type 1. Then, ?m1 can be assigned to Type 0 or Type 1. + + \remark The max constraint is produced when type checking Pi expressions of the form (Pi x : A, B), + and the type of A is t1 and the type of B is t2. So, if t2 == Bool, then max(t1, t2) == Bool */ enum class unification_constraint_kind { Eq, Convertible, Max, Choice };