Coq功能扩展性

时间:2016-03-25 17:03:56

标签: coq

我的目标是一个我希望重写其身体的功能,但是 一些函数参数妨碍了重写。 我用身份函数重新创建了这种情况。

如果函数是Defined,那么它可以工作,但是当函数时 是一个参数,我有一个公理说明如何重写,我是 无法重写。

我只能通过假设功能扩展性来实现它。 是否有可能以某种方式重写而不假设功能性扩展性?

Axiom functional_extensionality: forall {A B} (f g:A->B) , (forall x, f x = g x) -> f = g.

Variables A B : Type.
Variable f : A -> B.

Definition Id (x : B) := x.         (* here my function is Defined *)

Goal (fun x => Id (f x)) = f.       (* I'd like to rewrite inside the fun *)

Proof. auto. Qed.                   (* This works (eta reduction). *)

Variable Id' : B -> B.              (* Here I don't have the function definition *)
Axiom ID     : forall x, Id' x = x. (* only proof that it does the same thing *)
Goal (fun x => Id' (f x)) = f. 
Proof.
  rewrite ID.                       (* this doesnt work *)
  eauto using functional_extensionality, ID. (* but this works *)

1 个答案:

答案 0 :(得分:2)

不幸的是,如果不假设功能性扩展性,就无法证明这一点; Coq要求fun x => Id' (f x)) = fun x => f x定义"定义"。

"定义"这意味着什么简而言之,这意味着两个术语必须具有相同的正常形式语法。回想一下,在Coq中,每个术语都有一个正常形式(主要是)由β降低引起的。

但是,我们只知道Id' x = x"判断"。因此,Coq无法执行缩减Id' x ~> x,从而防止上述两个术语变得相等"定义"。

这确实是Coq理论的一个限制,据我所知,因此类型检查仍然可以判断。

完成此证明的另一种方法是推导出满足该等式的唯一函数是fun x => x(参数)。这将为您提供一个假设Hid: ID' = (fun x => x),您可以使用该假设来完成证明。不幸的是,Hid在Coq内部无法证明。