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

Rocq中带移位参数的Vector函数类型检查失败及证明参数问题

Coq(Rocq)向量右移函数的类型检查问题解决

问题核心

你遇到的是Coq依赖类型系统的严格长度匹配要求:Vector.splitat n v要求向量v的长度必须等于n + m(m是拆分后剩余部分的长度)。当shift是任意自然数时:

  1. 5 - shift可能不是合法的非负自然数(当shift > 5时)
  2. 即使你用Nat.min shift 5限制shift的范围,Coq无法自动推导出5 - Nat.min shift 5 + Nat.min shift 5 = 5这个长度等式,因此类型检查失败。

而固定s=3能通过,是因为Coq可以直接计算出5-3=2且2+3=5,自动满足splitat的长度要求。


解决方法

方案1:给函数添加shift ≤ 5的前提条件

通过显式传入shift ≤ 5的证明,让Coq确认5 - shift是合法长度,且满足(5-shift)+shift=5:

Require Import Coq.Vectors.Vector.
Import VectorNotations.
Require Import Coq.Arith.PeanoNat.

Definition Bvector := Vector.t bool.

Definition bv_right_shift_with_cond {shift : nat} (H : shift ≤ 5) (v : Bvector 5) : Bvector 5 :=
  let n := 5 - shift in
  (* 证明向量v的长度等于n + shift,满足splitat的要求 *)
  let v_split := @Vector.splitat bool n shift v (eq_sym (Nat.sub_add_le 5 shift H)) in
  Vector.append (Vector.const false shift) (fst v_split).
  • Nat.sub_add_le 5 shift H引理在shift ≤5时,保证(5-shift)+shift=5
  • eq_sym把等式转换成5 = n + shift,匹配splitat对输入向量长度的要求

方案2:自动处理shift>5的情况(结合Nat.min与证明)

用Nat.min shift 5限制偏移量不超过5,同时手动补充长度等式的证明:

Definition bv_right_shift_auto (shift : nat) (v : Bvector 5) : Bvector 5 :=
  let s := Nat.min shift 5 in
  let n := 5 - s in
  (* 利用Nat.min的性质,证明s ≤5,进而得到n+s=5 *)
  let len_eq := Nat.sub_add_le 5 s (Nat.min_le_r shift 5) in
  let v_split := @Vector.splitat bool n s v (eq_sym len_eq) in
  Vector.append (Vector.const false s) (fst v_split).
  • Nat.min_le_r shift 5给出Nat.min shift5 ≤5的证明
  • 后续逻辑和方案1一致,通过引理确认长度匹配

方案3:用依赖类型限定shift的范围

如果shift只能是0到5之间的数,可以用Fin.t 6类型(表示0到5的自然数),无需额外传入证明参数:

Require Import Coq.Vectors.Vector.
Import VectorNotations.
Require Import Coq.Arith.PeanoNat.
Require Import Coq.FSets.Finite_sets.

Definition Bvector := Vector.t bool.

Definition bv_right_shift_fin (shift : Fin.t 6) (v : Bvector 5) : Bvector 5 :=
  let s := Fin.to_nat shift in
  let n := 5 - s in
  (* Fin类型自带s ≤5的证明 *)
  let len_eq := Nat.sub_add_le 5 s (Fin.le_to_nat shift) in
  let v_split := @Vector.splitat bool n s v (eq_sym len_eq) in
  Vector.append (Vector.const false s) (fst v_split).
  • Fin.t 6强制shift的取值范围是0到5,避免了非法偏移的情况
  • Fin.le_to_nat shift自动提供s ≤5的证明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:39:55