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