coq中的多态数据类型是否允许强制?

coq中的多态数据类型是否允许强制?,coq,Coq,我使用了很多对类型,这些类型通常是自由强制的。然而,尽管上下文提供了类型,符号并没有显式地提供对的类型。以下代码提供了原理的简单MWE: Coercion nat_to_bool (n : nat) : bool := match n with | 0 => false | _ => true end. Inductive newtype : Type := | firstconstr : bool -> newtype | secondconstr

我使用了很多对类型,这些类型通常是自由强制的。然而,尽管上下文提供了类型,符号并没有显式地提供对的类型。以下代码提供了原理的简单MWE:

Coercion nat_to_bool (n : nat) : bool :=
  match n with
  | 0 => false
  | _ => true
  end.

Inductive newtype : Type :=
  | firstconstr : bool -> newtype
  | secondconstr : (bool * bool) -> newtype.

Check (3 : bool).
Check (firstconstr 3).
Fail Check (secondconstr (3, true)).
Check (secondconstr (@pair bool bool 3 true)).
失败消息是
术语“(3,true)“具有类型”(nat*bool)%type”,而预期它具有类型“(bool*bool)%type)。
显然,类型系统可以找出它应该是的类型,但不能决定正确地强制值


有没有一种方法来声明强制,使元组(以及其他具有推断类型的多态数据类型)能够正确地强制执行?

如果始终显式地构造元组对,那么您可以使用一种符号将强制执行到注释中(对于键入判断
G |-x:T
来说,这似乎是公平的,其中
x:T
是一对,尽管我认为整个判断通常被视为三元组)

以下是一个具有最小示例的PoC:

Notation "'secondconstr'' ( x , y )" := (secondconstr (x : bool, y)).

Check (secondconstr' (3, true)).
在您的
类型判断的上下文中,它可能如下所示:

Notation "Gamma |- v : T" := (types Gamma (v : value, T))
  (at level 100).

为了澄清这将与什么一起使用:我将
x:T
的符号声明为一对,
Gamma |-p
声明为
(类型Gamma对)
。如果x是一个变量名,它应该自动转换为一个值;但是由于缺乏强制,我不得不在语法中加入大量函数应用程序。