Coq 处理{x:nat | x>;=13/\x<;=19}形式的(子)类型的最佳方法?

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':我对青少年的定义似乎是一条死胡同;它更多的是声明性的,而不是建设性的,我

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':我对青少年的定义似乎是一条死胡同;它更多的是声明性的,而不是建设性的,我似乎已经失去了nat的归纳特性。我怎样才能展示它的居民?如果没有办法,我仍然可以坚持nat并使用道具和函数。(这里是新手,不到一周的自学时间)。

您在
青少年中使用的模式是“子类型”模式的一个实例。正如您所注意到的,a
{x:nat | px}
不同于
nat
。目前,Coq很少提供有效处理此类类型的支持,但如果您仅限于
P
的“行为良好”类,实际上可以以合理的方式工作。[顺便说一句,这应该成为Coq常见问题解答]

从长远来看,您可能希望对此模式使用特殊支持。math comp library
subType
接口提供了此类支持的一个很好的例子

描述此接口超出了您最初的问题,因此我将以几点评论作为结束:

  • 减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.