我不知道为什么,但是在Coq中,当试图证明程序规范时,我在尝试消除OR假设时遇到错误:
Error: Cannot find the elimination combinator or_rec, the elimination of the
inductive definition Logic.or on sort Set is probably not allowed.
这是我要证明的定理:
Definition nat_div_mod : forall a b:nat, not(b=0) -> {qr:nat*nat | P a b qr}.
这是错误发生时的目标和上下文:
a : nat
b : nat
H : b <> 0
IHa : {qr : nat * nat | P a b qr}
x : nat * nat
H2 : P a b x
H0 : snd x < b - 1 \/ snd x >= b - 1
______________________________________
{qr : nat * nat | P (S a) b qr}
在此定理之前,我有这个定义和这些导入:
Definition P (a b:nat) (qr:nat*nat) : Prop := ... (* specification of div/mod *)
Require Import Omega.
Require Import Mult.
当我尝试使用此策略时,我收到了上一个错误:
elim H0.
我真的不知道可能导致它的原因。
答案 0 :(得分:2)
您无法对H0
进行案例分析,因为{qr : nat * nat | P (S a) b qr}
是Set
或Type
。仅or_ind
定义or
,因此需要Prop
。如果您使用sum
,则会sum_ind
,sum_rec
和sum_rect
。
(snd x < b - 1) + (snd x >= b - 1)
Prop
的设计方式与某些公理一致。