coq中的多态数据类型是否允许强制?
我使用了很多对类型,这些类型通常是自由强制的。然而,尽管上下文提供了类型,符号并没有显式地提供对的类型。以下代码提供了原理的简单MWE: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
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是一个变量名,它应该自动转换为一个值;但是由于缺乏强制,我不得不在语法中加入大量函数应用程序。