You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Coq证明出现Some 0 = true跨类型子目标的原因排查

问题原因

你定义的optfun、boolfun以及引理lem的逻辑表述都没有问题,问题根源是当前环境中isSome的定义不符合预期。

标准的isSome来自Coq.Init.Option标准库,类型为 forall A : Type, option A -> bool,作用是判断一个option类型的值是否为Some构造子,内部实现为:

Definition isSome (A:Type) (o:option A) :=
  match o with
  | Some _ => true
  | None => false
  end.

你当前的环境没有引入这个标准定义,存在的异常isSome定义会直接返回输入的option值本身,导致isSome (Some 0)被规约为Some 0,而非预期的布尔值true,才会出现option nat类型的Some 0和bool类型的true相等的反常子目标。

修复方案

只需要在代码开头引入标准库的Option模块,即可正常完成证明:

Require Import ssreflect ssrfun ssrbool.
Require Import Unicode.Utf8.
Require Import Coq.Init.Option. (* 引入标准isSome定义 *)

Definition optfun (n: nat) : option nat :=
    match n with
    | 0 => Some 0
    | _ => None
    end.

Definition boolfun (n: nat) : bool :=
    match n with
    | 0 => true
    | _ => false
    end.

Lemma lem : ∀ n, isSome (optfun n) = boolfun n.
Proof.
    intro. unfold optfun, boolfun. destruct n.
    - simpl. reflexivity.
    - simpl. reflexivity.
Qed.

内容的提问来源于stack exchange,提问作者Sami Liedes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:48:01