如何在coq中使用sig强制

如何在coq中使用sig强制,coq,coercion,Coq,Coercion,我有一个类似的代码 Definition even := {n : nat | exists k, n = k + k}. Definition even_to_nat (e : even) : nat. Admitted. Coercion even_to_nat : even >-> nat. Example Ex : forall n : even, exists k, k + k = n. Admitted. Example Ex2 : forall k, exist

我有一个类似的代码

Definition even := {n : nat | exists k, n = k + k}.

Definition even_to_nat (e : even) : nat.
Admitted.

Coercion even_to_nat : even >-> nat.

Example Ex : forall n : even, exists k, k + k = n.
Admitted.

Example Ex2 : forall k, exists n : even, k + k = n.
Admitted.
在这种情况下,我应该如何删除
已接纳的

还有,为什么会这样

Example Ex' : forall n : even, exists k, n = k + k

即使是强迫也不行?是否有一种很好的方法来消除此类错误?

这是用Gallina编写的
偶数to nat
函数的定义:

Definition even := {n : nat | exists k, n = k + k}.

Definition even_to_nat (e : even) : nat :=
  match e with
  | exist _ n _ => n
  end.

Coercion even_to_nat : even >-> nat.
它在
e
上匹配模式以检索包装的自然数
n

这是一个使用策略的等效实现:

Definition even_to_nat_tac (e : even) : nat.
destruct e.
auto.
Defined.
destruct
策略基本上与
e
上的模式匹配。然后,
auto
自动使用内部的自然数来完成定义

下面是第一个示例的Gallina实现:

Example Ex : forall n : even, exists k, k + k = n :=
  fun n => match n with
  | exist _ n (ex_intro _ k eq) => ex_intro (fun k => k + k = n) k (eq_sym eq)
  end.
本质上,它在
n
上匹配模式,检索
k
n=k+k
的证明,然后使用
eq\u sym
翻转等式

下面是
Ex2
的一个实现:

Example Ex2 : forall k, exists n : even, k + k = n :=
  fun k =>
  let n := k + k in
  let exists_k := ex_intro (fun k => n = k + k) k eq_refl in
  let even_nat := exist (fun n => exists k, n = k + k) n exists_k in
  ex_intro (fun n => k + k = even_to_nat n) even_nat eq_refl.
exists\u k
是包含在偶数中的证明,说明
exists k,n+n=k
偶数
是满足条件的偶数
存在n,k+k=n
,其中
n
显然是
k+k
。最后,我居住在所需的类型中。似乎我不能在这里使用强制,所以我显式地使用了
偶到nat

或者,如果我添加类型注释,强制将起作用:

Example Ex2 : forall k, exists n : even, k + k = n :=
  fun k =>
  let n := k + k in
  let exists_k := ex_intro (fun k => n = k + k) k eq_refl in
  let even_nat := exist (fun n => exists k, n = k + k) n exists_k in
  ex_intro (fun (n : even) => k + k = n) even_nat eq_refl.
有关
Ex'
示例,请参阅中的警告。给定强制
强制bool\u in\u nat:bool>->nat.

请注意,检查(true=O)将失败。这是强迫的“正常”行为。为了验证true=O,强制从nat搜索到bool。没有


您只能在等式类型的右侧强制,而不能在左侧强制。

这是用Gallina编写的
偶数to nat
函数的定义:

Definition even := {n : nat | exists k, n = k + k}.

Definition even_to_nat (e : even) : nat :=
  match e with
  | exist _ n _ => n
  end.

Coercion even_to_nat : even >-> nat.
它在
e
上匹配模式以检索包装的自然数
n

这是一个使用策略的等效实现:

Definition even_to_nat_tac (e : even) : nat.
destruct e.
auto.
Defined.
destruct
策略基本上与
e
上的模式匹配。然后,
auto
自动使用内部的自然数来完成定义

下面是第一个示例的Gallina实现:

Example Ex : forall n : even, exists k, k + k = n :=
  fun n => match n with
  | exist _ n (ex_intro _ k eq) => ex_intro (fun k => k + k = n) k (eq_sym eq)
  end.
本质上,它在
n
上匹配模式,检索
k
n=k+k
的证明,然后使用
eq\u sym
翻转等式

下面是
Ex2
的一个实现:

Example Ex2 : forall k, exists n : even, k + k = n :=
  fun k =>
  let n := k + k in
  let exists_k := ex_intro (fun k => n = k + k) k eq_refl in
  let even_nat := exist (fun n => exists k, n = k + k) n exists_k in
  ex_intro (fun n => k + k = even_to_nat n) even_nat eq_refl.
exists\u k
是包含在偶数中的证明,说明
exists k,n+n=k
偶数
是满足条件的偶数
存在n,k+k=n
,其中
n
显然是
k+k
。最后,我居住在所需的类型中。似乎我不能在这里使用强制,所以我显式地使用了
偶到nat

或者,如果我添加类型注释,强制将起作用:

Example Ex2 : forall k, exists n : even, k + k = n :=
  fun k =>
  let n := k + k in
  let exists_k := ex_intro (fun k => n = k + k) k eq_refl in
  let even_nat := exist (fun n => exists k, n = k + k) n exists_k in
  ex_intro (fun (n : even) => k + k = n) even_nat eq_refl.
有关
Ex'
示例,请参阅中的警告。给定强制
强制bool\u in\u nat:bool>->nat.

请注意,检查(true=O)将失败。这是强迫的“正常”行为。为了验证true=O,强制从nat搜索到bool。没有


你只能在等式类型的右侧强制,不能在左侧强制。

我有一个问题:有没有办法用战术证明
Ex2
?我有一个问题:有没有办法用战术证明
Ex2