关于与_匹配的构造函数的证明

时间:2013-10-09 16:08:25

标签: coq

假设我有以下Set:

Inductive Many : Set := 
| aa: Many
| bb: Many
| cc: Many
(* | ... many more constructors *)
.

如何在_匹配中证明y<>aa

match x with
| aa     => true
| _ as y => (* how can i proof that y <> aa ? *)

1 个答案:

答案 0 :(得分:1)

不幸的是,如果没有纯粹的Gallina的更多工作,似乎不可能获得这样的证据。你想写的是:

  match x with
  | aa => true
  | y =>
    let yNOTaa : y <> aa := fun yaa =>
      eq_ind y (fun e => match e with aa => False | _ => True end) I aa yaa
    in false
  end

但是这在Gallina中不能很好地工作,因为它没有将通配符扩展到所有可能的情况,在y调用中留下eq_ind摘要。然而它确实在战术模式下工作:

refine (
  match x with
  | aa => true
  | y =>
    let yNOTaa : y <> aa := fun yaa =>
      eq_ind y (fun e => match e with aa => False | _ => True end) I aa yaa
    in false
  end
).

但它实际上构建了所​​有分支的扩展术语。


我刚刚发现有一种方法可以让Vernacular建立与精炼策略相同的术语。要做到这一点,你必须强制一个提到歧视的返回注释,如下所示:

Definition foo (x : many) : bool :=
  match x return (fun _ => bool) x with
  | aa => true
  | y =>
    let yNOTaa : y <> aa := fun yaa : y = aa =>
      @eq_ind many y (fun e => match e with aa => False | _ => True end) I aa yaa
    in false
  end
.

我的猜测是,无论匹配是否依赖,术语精化都有所不同......