【发布时间】:2021-06-05 05:42:37
【问题描述】:
所以我正在做一个学习 coq 的练习。我试图根据这种编码定义一个类型: forall X.(X -> X) -> X -> X;`这是来自 Alonzo Church(他提出了自然数的编码)如下:
0 , f:x:x
1 , f:x:fx
2 , f:x:f(fx)
3 , f:x:f(f(fx))
.....
n , f:x:fnx:
我的代码如下:
Definition nat := forall X : Type, (X -> X) -> X -> X.
这个练习要求我定义表达式 0、1、2 和 3,它们将对应的数字编码为 nat 的元素: 以下是我认为的结果
Definition zero : nat :=
fun (X : Type) (f : X -> X) (x : X) => x.
Definition one : nat :=
fun (X : Type) (f : X -> X) (x : X) => f x.
Definition two : nat :=
fun (X : Type) (f : X -> X) (x : X) => f (f x).
Definition three : nat :=
fun (X:Type)(f: X -> X)(x: X) => f ( f ( f x )).
我的问题是我需要证明 plus n one = succ n。 n 是我定义的类型 Nat
我有一个如下定义的 succ 函数:
Definition succ (n : nat) : nat :=
fun (X : Type) (f : X -> X) (x : X) => f (n X f x).
my plus 函数定义如下:
Definition plus (n m : nat) : nat :=
fun (X : Type) (f : X -> X) (x : X) => (n X f (m X f x)).
问题是当我试图证明 plus n one = succ n 时,我卡在了中间,不知道如何证明。 代码如下:
Theorem plus_succ: forall (n : nat),
plus n one = succ n.
Proof.
intros.
1 个子目标 ñ:自然 ______________________________________(1/1) 加n一=成功n
而且我无法进行反转或任何其他策略......(我是 Coq 新手,到目前为止我已经学习了列表、多边形、归纳和策略)
这让我想到,我上面定义的一个、两个或所有定义可能都不准确。 如果有人可以帮助我或给我一些提示,将不胜感激!谢谢!
【问题讨论】:
标签: coq