假设我有以下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 ? *)
答案 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
.
我的猜测是,无论匹配是否依赖,术语精化都有所不同......