如何在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
?