在两个等效函数上证明函数应用的相等性

时间:2018-07-11 16:57:40

标签: coq

我将如何在Coq中证明以下内容?

Variables f g : nat->nat.
Hypothesis Hfg : forall x, f x = g x.
Variable F : (nat->nat)->nat.
Goal F f = F g.

我们有两个函数fg,它们不一定相等,但等效。例如,f x可以是0+x,而g x可以是x+0

F返回一个nat,并且由于F无法调查其函数参数,因此无论返回值f还是{{1 }}。我该如何证明?

(它等效于g的证明,其中Proper ( f_eq ==> eq) F


在安东·特鲁诺夫(Anton Trunov)的回答之后进行编辑:我确实是在询问Coq逻辑的expressive power,所以我宁愿不添加公理,也不希望证明这等同于某些其他公理的弱形式。例如,我认为这比Functional Extensionality弱。

2 个答案:

答案 0 :(得分:2)

也许不足为奇,您的目标等同于在可确定的片段上进行某种功能的扩展。

请注意,说* aws_api_gateway_authorizer.accountprofileauth: Error creating API Gateway Authorizer: BadRequestException: Invalid Authorizer URI: arn:aws:lambda:us-east-2:XXXX:function:dev-authorizer. Authorizer URI should be a valid API Gateway ARN that represents a Lambda function invocation. status code: 400, request id: XXXX 等于说x = y

forall P, P x <-> P y

您的定理等同于函数可扩展性,其中我们将等式替换为可确定的弱化,而只考虑可确定的属性Definition eq_alt {A} (x y : A) : Prop := forall (P : A -> Prop), P x <-> P y. Lemma eq_alt_correct {A} (x y : A) : eq_alt x y <-> x = y. Proof. unfold eq_alt; intuition; subst; intuition. apply (H (eq x)); reflexivity. Qed.

P

所以现在的问题是,我们可以证明可判定片段的可扩展性吗?


让我们考虑一个更简单的版本。让我们考虑Require Import Coq.Classes.Morphisms. Definition equal_on_dec {A} (x y : A) : Prop := forall (P : A -> Prop) (P_dec : forall x, {P x} + {~P x}), P x <-> P y. Section F. Variable F : (nat->nat)->nat. Definition F_ext := Proper (pointwise_relation _ eq ==> eq) F. End F. Lemma F_ext_iff_neg_funext : (forall F, F_ext F) <-> (forall f g : nat -> nat, (forall x, f x = g x) -> equal_on_dec f g). Proof. unfold F_ext, Proper, pointwise_relation, respectful. split; [ intro Hfext | intro dfunext ]. { intros f g Hfg P P_dec. specialize (Hfext (fun f => if P_dec f then 0 else 1) f g Hfg). cbn in Hfext. do 2 edestruct P_dec; intuition; congruence. } { intros F f g Hfg. apply (dfunext f g); [ assumption | decide equality | reflexivity ]. } Qed. 。我们可以问:我们可以证明F : (bool->bool)->bool吗?我认为这里的答案仍然是“否”,但是我对使功能扩展性无效的模型了解不足,无法在此处进行证明。

答案 1 :(得分:1)

可以使用功能扩展性来证明目标。

From Coq Require Import FunctionalExtensionality.

Section Foo.
Variables f g : nat->nat.
Hypothesis Hfg : forall x, f x = g x.
Variable F : (nat->nat)->nat.

Goal F f = F g.
Proof. now apply functional_extensionality in Hfg; subst. Qed.
End Foo.

但是这里真的有必要吗?答案是“是”,因为如果您有一般证明,则可以针对F实例化它,它是身份函数,表示(forall x, f x = g x) -> f = g。或者,更正式地说,是更普遍的情况:

Axiom axiom : forall A B C (f g : A -> B) (eqv : forall x, f x = g x)
              (F : (A -> B) -> C), F f = F g.

Lemma fun_ext A B (f g : A -> B) :
  (forall x, f x = g x) -> f = g.
Proof.
  intros eqv; apply (axiom A B _ f g eqv (fun x => x)).
Qed.