为什么不可能对结论中使用的术语进行归纳?

鹿角

假设以下特定情况。

我们有一个平等的定义:

Inductive eqwal {A : Type} (x : A) : A -> Prop :=
    eqw_refl : eqwal x x.

和豌豆坚果:

Inductive nawt : Prop :=
    | zewro : nawt
    | sawc  : nawt -> nawt.

我们在nat上定义加法:

Fixpoint plaws (m n : nawt) : nawt :=
    match m with
      | zewro => n
      | sawc m' => sawc (plaws m' n)
    end.

现在我们要证明零从正确的角度是中性的。总结:

Theorem neutral_r : forall n : nawt, eqwal (plaws n zewro) n.

遗憾的是,以下证明的最后一行说“错误:结论中使用了n。 ”。

Proof.
intros.
induction n. - this is the culprit

官方文档中关于错误的内容不多,我有些困惑-为什么会发生此错误?

使用标准库,我可以轻松证明定理:

Theorem neutral_r : forall n : nat,
  n + 0 = n.
Proof.
  induction n; try reflexivity.
  cbn; rewrite IHn; reflexivity.
Qed.
亚瑟·阿兹维多·德·阿莫林

问题是您nawt使用sortProp而不是Typeor进行定义Set默认情况下,为命题生成的归纳原理不允许我们证明有关这些命题证明的任何信息。考虑为以下项生成的默认归纳原理nawt

Check nawt_ind.
> nawt_ind : forall P : Prop, P -> (nawt -> P -> P) -> nawt -> P

由于nawt_ind量化超过Prop而不是nat -> Prop,我们无法使用它来证明您的目标。

解决方案是设置一些选项来更改Coq的默认行为,如以下脚本所示。

Inductive eqwal {A : Type} (x : A) : A -> Prop :=
    eqw_refl : eqwal x x.

Unset Elimination Schemes.

Inductive nawt : Prop :=
    | zewro : nawt
    | sawc  : nawt -> nawt.

Scheme nawt_ind := Induction for nawt Sort Prop.

Set Elimination Schemes.

Fixpoint plaws (m n : nawt) : nawt :=
    match m with
      | zewro => n
      | sawc m' => sawc (plaws m' n)
    end.

Theorem eqwal_sym {A : Type} (x y : A) : eqwal x y -> eqwal y x.
Proof. intros H. destruct H. constructor. Qed.

Theorem neutral_r : forall n : nawt, eqwal (plaws n zewro) n.
Proof.
intros. induction n as [|n IH]; simpl.
- constructor.
- apply eqwal_sym in IH. destruct IH. constructor.
Qed.

Elimination Schemes选项使Coq自动生成数据类型和命题的归纳原理。在此脚本中,我只是将其关闭,并使用该Scheme命令为生成了正确的归纳原理nawt为使该induction策略起作用,重要的是给该原理命名nawt_ind:这是Coq生成的默认名称,并且是induction在调用时寻找的名称。

话虽这么说,我一般会建议不要在定义类型的自然数Prop,而不是Type,因为勒柯克强加给你如何使用的东西,住在限制Prop例如,不可能显示与zewro的不同sawc zewro

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在声明常量变量后就不可能对其进行初始化?

来自分类Dev

为什么在实例化具有具体类型的对象时不可能对变量使用泛型类型?

来自分类Dev

为什么宏不可能和不太可能对ARM汇编代码产生任何影响?

来自分类Dev

不可能对声明的输入强制使用整数

来自分类Dev

为什么不可能在 Java 中使用 if 语句构建二进制信号量

来自分类Dev

为什么在rust中使用动态错误而不是枚举很常见?使用编译时变体不好/不可能吗?

来自分类Dev

为什么在Scala中不可能将变量与`to`一起使用?

来自分类Dev

为什么在Kotlin中不可能使用对`suspend`函数的方法引用?

来自分类Dev

观看未使用的局部变量是不可能的吗?为什么?

来自分类Dev

Nullable <int?>是不可能的,为什么不能呢?

来自分类Dev

为什么在C中不可能重载?

来自分类Dev

为什么在Haskell中不可能分割整数?

来自分类Javascript

为什么不可能从原型更改构造函数?

来自分类Dev

为什么阶乘1000年不可能的BigInteger?

来自分类Dev

volatile struct = struct不可能,为什么?

来自分类Dev

为什么本文中的这个问题是不可能的?

来自分类Dev

为什么不可能用焦点影响子元素?

来自分类Dev

不可能对懒惰的财产设定期望吗?

来自分类Dev

如果不可能在 CoC 上进行 O(1) 预测,那么为什么会这样呢?

来自分类Dev

openlayers:使用MVT VectorTileSource进行群集不可能吗?

来自分类Dev

为什么直接使用泛型值是不可能的,但如果从 Dart 中的方法返回也是可能的

来自分类Dev

我可以得出结论,在cntk中不可能实现“深梦”吗?

来自分类Dev

为什么 Rust 不能对不可变变量进行可变借用?

来自分类Dev

为什么$-引用可能对Perl数组?

来自分类Dev

为什么不能对OrderedDict进行洗牌?

来自分类Dev

SHARE锁定记录的行为,为什么聚合功能不可能?

来自分类Dev

为什么 Collection.equals() JavaDoc 说不可能正确实现 List 和 Set?

来自分类Dev

为什么不可能通过互斥量传递互斥体来发挥作用?

来自分类Dev

为什么不可能通过ddrescue压缩动态图像?

Related 相关文章

  1. 1

    为什么在声明常量变量后就不可能对其进行初始化?

  2. 2

    为什么在实例化具有具体类型的对象时不可能对变量使用泛型类型?

  3. 3

    为什么宏不可能和不太可能对ARM汇编代码产生任何影响?

  4. 4

    不可能对声明的输入强制使用整数

  5. 5

    为什么不可能在 Java 中使用 if 语句构建二进制信号量

  6. 6

    为什么在rust中使用动态错误而不是枚举很常见?使用编译时变体不好/不可能吗?

  7. 7

    为什么在Scala中不可能将变量与`to`一起使用?

  8. 8

    为什么在Kotlin中不可能使用对`suspend`函数的方法引用?

  9. 9

    观看未使用的局部变量是不可能的吗?为什么?

  10. 10

    Nullable <int?>是不可能的,为什么不能呢?

  11. 11

    为什么在C中不可能重载?

  12. 12

    为什么在Haskell中不可能分割整数?

  13. 13

    为什么不可能从原型更改构造函数?

  14. 14

    为什么阶乘1000年不可能的BigInteger?

  15. 15

    volatile struct = struct不可能,为什么?

  16. 16

    为什么本文中的这个问题是不可能的?

  17. 17

    为什么不可能用焦点影响子元素?

  18. 18

    不可能对懒惰的财产设定期望吗?

  19. 19

    如果不可能在 CoC 上进行 O(1) 预测,那么为什么会这样呢?

  20. 20

    openlayers:使用MVT VectorTileSource进行群集不可能吗?

  21. 21

    为什么直接使用泛型值是不可能的,但如果从 Dart 中的方法返回也是可能的

  22. 22

    我可以得出结论,在cntk中不可能实现“深梦”吗?

  23. 23

    为什么 Rust 不能对不可变变量进行可变借用?

  24. 24

    为什么$-引用可能对Perl数组?

  25. 25

    为什么不能对OrderedDict进行洗牌?

  26. 26

    SHARE锁定记录的行为,为什么聚合功能不可能?

  27. 27

    为什么 Collection.equals() JavaDoc 说不可能正确实现 List 和 Set?

  28. 28

    为什么不可能通过互斥量传递互斥体来发挥作用?

  29. 29

    为什么不可能通过ddrescue压缩动态图像?

热门标签

归档