以coq为单位计算可判定属性中的if

以coq为单位计算可判定属性中的if,coq,Coq,我想写一个计算p0真值计数的函数。。p t在nat->prop函数中 Section count\u sc。 变量p:nat->Prop。 假设p_dec:forall x:nat,{px}+{~px}。 固定点计数(x:nat):= 将x与 |0=>如果p_dec(0),则1否则0 |sy=>如果p_dec(x),则1+计数y,否则计数y 结束。 结束计数。 定义fret(x:nat):=假。 检查计数。 公理fret_dec:forall x:nat,{fret x}+{~fret x}。

我想写一个计算p0真值计数的函数。。p t在nat->prop函数中

Section count\u sc。
变量p:nat->Prop。
假设p_dec:forall x:nat,{px}+{~px}。
固定点计数(x:nat):=
将x与
|0=>如果p_dec(0),则1否则0
|sy=>如果p_dec(x),则1+计数y,否则计数y
结束。
结束计数。
定义fret(x:nat):=假。
检查计数。
公理fret_dec:forall x:nat,{fret x}+{~fret x}。
定理hello\u decision:forall x:nat,count fret fret\u dec x=0。
证明。
介绍。
诱导x。
数一数。
将(fret_dec 0)替换为false。

Qed您已经声明了
fret_dec
作为一个公理。但这意味着它没有定义,换句话说,也没有实现。因此,Coq不能用它来计算

您仍然可以使用
destruct
策略像这样证明您的定理:

Theorem hello_decide : forall x : nat , count fret fret_dec x = 0.
Proof.
  induction x as [| x IH].
  - unfold count. destruct (fret_dec 0) as [contra | _].
    + contradiction. 
    + reflexivity.
  - simpl. rewrite IH. destruct (fret_dec (S x)) as [contra | _].
    + contradiction.
    + reflexivity.
Qed. 
但是,在这种情况下,提供这样一个决策过程而不是假设它是非常容易的。这大大简化了证明:

Definition fret_dec' (x : nat) : { fret x } + { ~ fret x }.
Proof. right. intros contra. contradiction. Defined.

Theorem hello_decide' : forall x : nat , count fret fret_dec' x = 0.
Proof.
  induction x as [|x IH]; simpl.
  - reflexivity. 
  - exact IH.
Qed.