Coq 计数谓词的有充分根据的归纳法
下面是Count谓词的定义。它使用2个索引来表示开始和结束元素,“check”谓词用于计数/跳过“current”元素,最后一个参数“sum”用于跟踪满足这些边界索引之间的check谓词的元素数Coq 计数谓词的有充分根据的归纳法,coq,Coq,下面是Count谓词的定义。它使用2个索引来表示开始和结束元素,“check”谓词用于计数/跳过“current”元素,最后一个参数“sum”用于跟踪满足这些边界索引之间的check谓词的元素数 Require Import ZArith. Open Scope Z_scope. Inductive Count : Z -> Z -> (Z -> Prop) -> Z -> Prop := | Q_Nil: forall (m n : Z
Require Import ZArith.
Open Scope Z_scope.
Inductive Count : Z -> Z -> (Z -> Prop) -> Z -> Prop :=
| Q_Nil:
forall (m n : Z),
forall (check : Z -> Prop),
(n <= m) ->
(Count m n check 0)
| Q_Hit:
forall (m n sum : Z),
forall (check : Z -> Prop),
let x := (n - 1) in
(m < n) ->
(check x) ->
(Count m x check sum) ->
(Count m n check (1 + sum))
| Q_Miss:
forall (m n sum : Z),
forall (check : Z -> Prop),
let x := (n - 1) in
(m < n) ->
~(check x) ->
(Count m x check sum) ->
(Count m n check sum).
1子目标
m、 n,和:Z
检查:Z->Prop
p:=n-m:Z
gt:m+p>m
PZ:p>0
______________________________________(1/1)
计数m(m+p)校验和->0您可以在计数
假设上使用归纳
(在某种程度上,这是归纳
类型的要点)
您可以在计数
假设中使用归纳
(在某种程度上,这是归纳
类型的要点)
Goal
forall (m n sum : Z),
forall (check : Z -> Prop),
(Count m n check sum) -> (0 <= sum).
Proof.
Proof.
Require Import Psatz.
intros m n sum check.
assert (X: n <= m \/ n > m) by lia.
destruct X as [le|gt].
+ intro.
inversion H; subst; intuition.
+ pose (p := (n - m)).
assert (PZ: p > 0). { subst p. auto with zarith. }
replace n with (m + p) in * by (subst p; auto with zarith).
1 subgoal
m, n, sum : Z
check : Z -> Prop
p := n - m : Z
gt : m + p > m
PZ : p > 0
______________________________________(1/1)
Count m (m + p) check sum -> 0 <= sum
Proof.
intros.
induction H.
all: omega.
(* or, as a single sequence: intros; induction H; omega. *)
(* lia also works instead of omega, and should probably be preferred nowadays (Require Import Lia.) *)
Qed.