Coq 什么是次级目标;nat";

Coq 什么是次级目标;nat";,coq,Coq,在试图证明引理时,我遇到了一种情况,即只剩下一个子目标,即nat: 1 subgoal ... ______________________________________(1/1) nat 我不明白那是什么意思。 我到底需要证明什么?有关于这个主题的文档吗(coq问题对谷歌来说非常难) 我不想分享真正的引理,因为这是一个任务。基本上,我试图证明一个归纳定义,它是这样的: Inductive indef : deftype -> Prop := | foo x : indef (cons

在试图证明引理时,我遇到了一种情况,即只剩下一个子目标,即
nat

1 subgoal
...
______________________________________(1/1)
nat
我不明白那是什么意思。 我到底需要证明什么?有关于这个主题的文档吗(coq问题对谷歌来说非常难)

我不想分享真正的引理,因为这是一个任务。基本上,我试图证明一个归纳定义,它是这样的:

Inductive indef : deftype -> Prop :=
| foo x : indef (construct_0 x)
| bar a : (forall x, some_predicate x a) -> indef (construct_1 a).
在证明中,我能够证明
(对于所有x:nat,一些谓词xa)
。虽然谓词
some\u谓词
仅为
nat
定义,但我怀疑问题与
x
的类型在
indef
的定义中没有明确说明有关。
这可能是我看到
nat
子目标的原因吗?

这里有一个例子,但我认为它不适合您的用例。我有一个生成逻辑语句证明的函数,但是这个函数需要一个整数。这个整数实际上对于证明是无用的,但是出于键入的原因,这个函数的任何使用都需要这个整数

Definition my_fun (n : nat) : True := I.

Lemma dummy_setup : True.
Proof. apply my_fun.
因此,在这一点上,函数my_fun需要一个类型为
nat
的参数,该参数不在其他任何地方使用,但它必须存在。Coq系统处理此参数时,将其视为逻辑目的所需的证明,因此它要求您提供此类型的元素。通常情况下,这表明您的函数设计得很糟糕,并且它们采用了不使用的参数。避免这种情况的方法是回到你的引理,确保它们没有无用的论点

这里是另一个例子。
my_trans
引理接受了一个无用的参数

Require Import Arith.
Lemma my_trans : forall x y z t, x <= y -> y <= z -> x <= z.
Proof.  intros x y z; apply (le_trans x y z). Qed.
需要导入算术。

引理my_trans:对于所有x y z t,x y x只要你的引理的结果类型是一个
Prop
,Coq并不真正关心你在证明过程中如何填充子目标通过填写子目标,您实际上提供了该目标类型的值。

考虑这一点:

如果遇到目标
True
,则可以通过提供类型为
True
的值,即
I
来明确填写目标。用战术语言,你可以写:

1 subgoal
______________________________________(1/1)
True

exact I.     (* explicit way, or  *)
constructor. (* less explicit way *)

No more subgoals.
拥有一个nat类型的目标是一样的。显然,
O
是一个类型为
nat
的值(任何自然数如
12432523547835
),因此您可以用它来填充目标:

1 subgoal
______________________________________(1/1)
nat

exact O.              (* this obviously works *)
exact 12432523547835. (* this does work too   *)

No more subgoals.

可能不相关,但目标或类型
nat
或任何其他类型在“以证明模式编写定义”的上下文中完全有意义。例如,函数

Definition double (x : nat) : nat := x + x.
可以用这种方式定义(但不要这样做,除非目标类型是复杂的依赖类型,并且结果不能用经典的方式轻松表示):



我想我曾经遇到过类似的情况,当我为一个有充分根据的递归函数编写证明时,我不知何故对目标应用了一个错误的假设(即,正在定义的函数,它实际上不是一个假设)。但是我仍然可以完成证明,并且定义的函数按预期工作。

您能告诉我们是什么策略导致了它吗?
Definition double (x : nat) : nat := x + x.
Definition double (x : nat) : nat.

1 subgoal
x : nat
______________________________________(1/1)
nat

exact (x + x).  (* Fill the goal with desired value *)

No more subgoals.

Defined.      (* Use this instead of Qed to allow Coq to unfold the definition *)
Print double. (* Checking that the function body is correct *)

double = fun x : nat => x + x
     : nat -> nat