在 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.