在 Coq 中定义使用程序时,义务中缺少信息的问题
Problems with missing information in Obligations when defining using Program in Coq
我是 Coq 的新手,正在尝试弄清楚如何使用 Program
更轻松地定义事物然后解决义务,但是,有时我会遇到无法解决的义务,因为某些信息已被删除迷路了。
例如,如果我定义了以下内容(有点做作,但这是我能想到的最简单的示例),那么函数 f 如果函数采用两个相同的偶数和 return 该数字的两倍.
Program Definition f {n : nat} (k1 k2 : {j : nat | j + j = n}) : {j : nat | j = n} := k1 + k2.
Next Obligation.
问题是,当我开始解决第一个义务时,这就是我剩下的
k1, k2 : nat
============================
k1 + k2 = k2 + k2
显然无法求解,因为我丢失了有关k1 + k1 = k2 + k2
的信息,剩下的就是证明任意两个自然数相等。
为什么会发生这种情况,在那种情况下你会怎么做才能让 Coq 记住“所有假设”?
这是 program_simpl
策略的作用,它是每当您打开 Obligation
时默认应用的 Obligation Tactic
(并且在您打开它们之前完全解决义务)。您可以通过将其设置为 idtac
来关闭它。如果这太过分了,如果它不能彻底解决义务(所以可以自动解决的义务是),你可以扔掉它的结果。
Require Import Psatz.
#[local] Obligation Tactic := try now program_simpl.
#[program] Definition f {n : nat} (k1 k2 : {j : nat | j + j = n}) : {j : nat | j = n} := k1 + k2.
Next Obligation.
intros n [k1 ?] [k2 ?]. (* program_simpl is responsible for the usual automatic intros, but now we have to do it *)
simpl.
lia.
Qed.
我是 Coq 的新手,正在尝试弄清楚如何使用 Program
更轻松地定义事物然后解决义务,但是,有时我会遇到无法解决的义务,因为某些信息已被删除迷路了。
例如,如果我定义了以下内容(有点做作,但这是我能想到的最简单的示例),那么函数 f 如果函数采用两个相同的偶数和 return 该数字的两倍.
Program Definition f {n : nat} (k1 k2 : {j : nat | j + j = n}) : {j : nat | j = n} := k1 + k2.
Next Obligation.
问题是,当我开始解决第一个义务时,这就是我剩下的
k1, k2 : nat
============================
k1 + k2 = k2 + k2
显然无法求解,因为我丢失了有关k1 + k1 = k2 + k2
的信息,剩下的就是证明任意两个自然数相等。
为什么会发生这种情况,在那种情况下你会怎么做才能让 Coq 记住“所有假设”?
这是 program_simpl
策略的作用,它是每当您打开 Obligation
时默认应用的 Obligation Tactic
(并且在您打开它们之前完全解决义务)。您可以通过将其设置为 idtac
来关闭它。如果这太过分了,如果它不能彻底解决义务(所以可以自动解决的义务是),你可以扔掉它的结果。
Require Import Psatz.
#[local] Obligation Tactic := try now program_simpl.
#[program] Definition f {n : nat} (k1 k2 : {j : nat | j + j = n}) : {j : nat | j = n} := k1 + k2.
Next Obligation.
intros n [k1 ?] [k2 ?]. (* program_simpl is responsible for the usual automatic intros, but now we have to do it *)
simpl.
lia.
Qed.