Coq 处理{x:nat | x>;=13/\x<;=19}形式的(子)类型的最佳方法?
Coq让我来定义一下:Coq 处理{x:nat | x>;=13/\x<;=19}形式的(子)类型的最佳方法?,coq,Coq,Coq让我来定义一下: Definition teenagers : Set := { x : nat | x >= 13 /\ x <= 19 }. 但不是: Example minus_20 : forall x:teenagers, x<20. 这是因为Julia(青少年类型)无法与12(nat)相比 Q:我应该如何告知Coq Julia的支持类型是nat,以便我可以写任何关于她的有用信息 Q':我对青少年的定义似乎是一条死胡同;它更多的是声明性的,而不是建设性的,我
Definition teenagers : Set := { x : nat | x >= 13 /\ x <= 19 }.
但不是:
Example minus_20 : forall x:teenagers, x<20.
这是因为Julia(青少年类型)无法与12(nat)相比
Q:我应该如何告知Coq Julia的支持类型是nat,以便我可以写任何关于她的有用信息
Q':我对青少年的定义似乎是一条死胡同;它更多的是声明性的,而不是建设性的,我似乎已经失去了nat的归纳特性。我怎样才能展示它的居民?如果没有办法,我仍然可以坚持nat并使用道具和函数。(这里是新手,不到一周的自学时间)。您在
青少年中使用的模式是“子类型”模式的一个实例。正如您所注意到的,a{x:nat | px}
不同于nat
。目前,Coq很少提供有效处理此类类型的支持,但如果您仅限于P
的“行为良好”类,实际上可以以合理的方式工作。[顺便说一句,这应该成为Coq常见问题解答]
从长远来看,您可能希望对此模式使用特殊支持。math comp librarysubType
接口提供了此类支持的一个很好的例子
描述此接口超出了您最初的问题,因此我将以几点评论作为结束:
- 在
减20
示例中,您希望使用数据类型的第一个投影。请为所有x:青少年尝试,proj1\u sig x<20
。如果您将投影声明为强制
,Coq可以尝试自动插入此类投影:
Require Import Omega.
Definition teenagers : Set :=
{ x : nat | x >= 13 /\ x <= 19 }.
Coercion teen_to_nat := fun x : teenagers => proj1_sig x.
Implicit Type t : teenagers.
Lemma u t : t < 20.
Proof. now destruct t; simpl; omega. Qed.
然后,可以将对基类型的推理转移到子类型。另见:
[编辑]:我在math comp中添加了两个典型的子类型示例,因为我认为它们很好地说明了这个概念:
- 调整列表大小或
n.-tuples
。长度为n的列表在math comp中表示为一对单个列表加上大小证明,即n.-tuple T={s:seq T | size s==n}
。多亏了内射性和协同性,您可以在元组上使用所有常规列表函数,它们工作得很好
- 有界自然数或序数:类似地,类型
'I_n={x:nat|x
的工作原理几乎与自然数相同,但有界
Thx!这对我来说已经有很多新的关键词(强制?)和概念,但我很高兴有一个积极的答案可以挖掘。感谢Thx在coq标签上如此积极和有建设性。欢迎您;这个特殊的用例是一个复杂的用例,专门针对初学者和IIRC,SF中没有深入介绍。请随意询问您对代码的任何问题。@FZed CPDT涵盖子集类型,从开始。我希望有一本关于数学comp/ssreflect的教科书,我可以推荐:)我听说正在进行一些工作。。。ITP很快就会有一个教程:可以在浏览器中运行,这也提供了一些练习,但它是面向数学的。
Example Julia_fact1 : Julia > 12.
Require Import Omega.
Definition teenagers : Set :=
{ x : nat | x >= 13 /\ x <= 19 }.
Coercion teen_to_nat := fun x : teenagers => proj1_sig x.
Implicit Type t : teenagers.
Lemma u t : t < 20.
Proof. now destruct t; simpl; omega. Qed.
forall t1 t2, teen_to_nat t1 = teen_to_nat t2 -> t1 = t2.