我将如何在Coq中证明以下内容?
Variables f g : nat->nat.
Hypothesis Hfg : forall x, f x = g x.
Variable F : (nat->nat)->nat.
Goal F f = F g.
我们有两个函数f
和g
,它们不一定相等,但等效。例如,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弱。
答案 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.