【问题标题】:Coq: How to produce a strong polymorphic dependent type hypothesisCoq:如何产生一个强多态依赖类型假设
【发布时间】:2019-03-05 02:13:30
【问题描述】:

由于“弱假设”,我在依赖归纳方面遇到了一些问题。

例如:

我有一个依赖的完整可折叠列表:

Inductive list (A : Type) (f : A -> A -> A) : A -> Type :=
  |Acons : forall {x x'' : A} (y' : A) (cons' : list f (f x x'')), list f (f (f x x'') y')
  |Anil : forall (x: A) (y : A), list f (f x y).

还有一个从归纳类型列表中返回应用的折叠值的函数,以及通过匹配强制计算这些值的其他函数。

Definition v'_list {X} {f : X -> X -> X} {y : X} (A : list f y) := y.

Fixpoint fold {A : Type} {Y : A} (z : A -> A -> A) (d' : list z Y) :=
  match d' return A with
    |Acons x y => z x (@fold _ _ z y)
    |Anil _ x y  => z x y
   end.

显然,如果具有相同的依赖类型列表,则该函数返回相同的值并证明这不应该那么难。

Theorem listFold_eq : forall {A : Type} {Y : A} (z : A -> A -> A) (d' : list z Y), fold d' = v'_list d'.
intros.
generalize dependent Y.
dependent induction d'.
(.. so ..)
Qed.

我的问题是依赖定义为我生成了一个弱假设。

因为我在使用依赖定义的大多数证明中都有类似的东西,所以上面的证明问题:

A : Type
z : A -> A -> A
x, x'', y' : A
d' : list z (z x x'')
IHd' : fold d' = v'_list d'
______________________________________(1/2)
fold (Acons y' d') = v'_list (Acons y' d')

即使我在 (z x x'') 中有一个多态定义,我也无法在我的目标中应用 IHd'。

我的问题是,是否有办法定义更“强大”和多态的归纳,而不是疯狂地重写有时让我苦恼的术语。

【问题讨论】:

    标签: coq proof coq-tactic induction proof-of-correctness


    【解决方案1】:

    如果你这样做

    simpl.
    unfold v'_list.
    

    你可以看到你快到了(你可以完成重写),但是z 的参数顺序错误,因为listfold 不同意折叠的方式应该去。

    在不相关的注释中,Acons 可以量化单个x,将f x x'' 替换为仅x

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-05-01
      • 2021-06-05
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多