Coq 在某一点上更改函数

Coq 在某一点上更改函数,coq,Coq,我有两个元素f:X->bool和X:X 如何为y定义g:X->bool这样的gx=true和gy=fyx、 根据您对我的评论的回答,我认为您无法定义“函数”g,因为您需要一种有建设性的方法来区分x与x类型的其他实例。然而,您可以定义两者之间的关系,如果您获得可判定性,可以将其转换为函数。 比如: Parameter X : Type. Parameter f : X -> bool. Parameter x : X. Inductive gRel : X -> bool ->

我有两个元素
f:X->bool
X:X


如何为y定义
g:X->bool
这样的
gx=true
gy=fy
x、 根据您对我的评论的回答,我认为您无法定义“函数”
g
,因为您需要一种有建设性的方法来区分
x
x
类型的其他实例。然而,您可以定义两者之间的关系,如果您获得可判定性,可以将其转换为函数。 比如:

Parameter X : Type.
Parameter f : X -> bool.
Parameter x : X.

Inductive gRel : X -> bool -> Prop :=
  | is_x : gRel x true
  | is_not_x : forall y: X, y <> x -> gRel y (f y)
.

Definition gdec (h: forall a b: X, {a = b}+{a <> b}) : X -> bool :=
  fun a => if h a x then true else f a.

Lemma gRel_is_a_fun: (forall a b: X, {a = b}+{a <> b}) ->
  exists g : X -> bool, forall a, gRel a (g a).
Proof.
intro hdec.
exists (gdec hdec); unfold gdec.
intro a; destruct (hdec a x).
now subst; apply is_x.
now apply is_not_x.
Qed.
参数X:Type。
参数f:X->bool。
参数x:x。
归纳格蕾尔:X->布尔->道具:=
|_x:grelx是真的吗
|不是吗
.
定义gdec(h:forall ab:X,{a=b}+{ab}):X->bool:=
乐趣a=>如果h为x,则为真,否则为f。
引理gRel_是有趣的:(对于所有ab:X,{a=b}+{ab})->
存在g:X->bool、forall a、gRel a(ga)。
证据
介绍hdec。
存在(gdec hdec);展开gdec。
导言a;自毁(hdec a x)。
现在是subst;应用是_x。
现在应用不是。
Qed。

根据您对我的评论的回答,我认为您无法定义“函数”
g
,因为您需要一种有建设性的方法来区分
x
x
类型的其他实例。然而,您可以定义两者之间的关系,如果您获得可判定性,可以将其转换为函数。 比如:

Parameter X : Type.
Parameter f : X -> bool.
Parameter x : X.

Inductive gRel : X -> bool -> Prop :=
  | is_x : gRel x true
  | is_not_x : forall y: X, y <> x -> gRel y (f y)
.

Definition gdec (h: forall a b: X, {a = b}+{a <> b}) : X -> bool :=
  fun a => if h a x then true else f a.

Lemma gRel_is_a_fun: (forall a b: X, {a = b}+{a <> b}) ->
  exists g : X -> bool, forall a, gRel a (g a).
Proof.
intro hdec.
exists (gdec hdec); unfold gdec.
intro a; destruct (hdec a x).
now subst; apply is_x.
now apply is_not_x.
Qed.
参数X:Type。
参数f:X->bool。
参数x:x。
归纳格蕾尔:X->布尔->道具:=
|_x:grelx是真的吗
|不是吗
.
定义gdec(h:forall ab:X,{a=b}+{ab}):X->bool:=
乐趣a=>如果h为x,则为真,否则为f。
引理gRel_是有趣的:(对于所有ab:X,{a=b}+{ab})->
存在g:X->bool、forall a、gRel a(ga)。
证据
介绍hdec。
存在(gdec hdec);展开gdec。
导言a;自毁(hdec a x)。
现在是subst;应用是_x。
现在应用不是。
Qed。

作为对Vinz答案的补充,没有办法为任意
X
定义这样一个函数,因为它意味着
X
具有“几乎可判定”的等式:

Section Dec.

Variable X : Type.

Variable override : (X -> bool) -> X -> X -> bool.

Hypothesis Hoverride_eq : forall f x, override f x x = true.
Hypothesis Hoverride_neq : forall f x x', x <> x' -> override f x x' = f x'.

Lemma xeq_dec' (x x' : X) : {~ x <> x'} + {x <> x'}.
Proof.
  destruct (override (fun _ => false) x x') eqn:E.
  - left.
    intros contra.
    assert (H := Hoverride_neq (fun _ => false) _ _ contra).
    simpl in H.
    congruence.
  - right.
    intros contra.
    subst x'.
    rewrite Hoverride_eq in E.
    discriminate.
Qed.

End Dec.
第12节。
变量X:Type。
变量覆盖:(X->bool)->X->X->bool。
假设:对于所有Fx,覆盖Fx=真。
假设:对于所有fx',x'->覆盖fx'=fx'。
引理xeq_dec'(x x:x):{~x'}+{x'}。
证据
析构函数(override(fun =>false)x')eqn:E。
-左。
反面介绍。
断言(H:=Hoverride\u neq(fun=false)\u相反)。
H中的simple。
相似
-对。
反面介绍。
subst x'。
重写E中的Hoverride_eq。
区别对待
Qed。
12月底。

这个引理说,如果有一种方法可以实现你要求的
X
,那么你可以测试
X
的两个元素
X
X'
是否相等,除了在
true
情况下得到的等式证明实际上是
x=x'

的双重否定的证明,只是对Vinz的答案的补充,没有办法为任意
x
定义这样一个函数,因为它意味着
x
具有“几乎可判定”的等式:

Section Dec.

Variable X : Type.

Variable override : (X -> bool) -> X -> X -> bool.

Hypothesis Hoverride_eq : forall f x, override f x x = true.
Hypothesis Hoverride_neq : forall f x x', x <> x' -> override f x x' = f x'.

Lemma xeq_dec' (x x' : X) : {~ x <> x'} + {x <> x'}.
Proof.
  destruct (override (fun _ => false) x x') eqn:E.
  - left.
    intros contra.
    assert (H := Hoverride_neq (fun _ => false) _ _ contra).
    simpl in H.
    congruence.
  - right.
    intros contra.
    subst x'.
    rewrite Hoverride_eq in E.
    discriminate.
Qed.

End Dec.
第12节。
变量X:Type。
变量覆盖:(X->bool)->X->X->bool。
假设:对于所有Fx,覆盖Fx=真。
假设:对于所有fx',x'->覆盖fx'=fx'。
引理xeq_dec'(x x:x):{~x'}+{x'}。
证据
析构函数(override(fun =>false)x')eqn:E。
-左。
反面介绍。
断言(H:=Hoverride\u neq(fun=false)\u相反)。
H中的simple。
相似
-对。
反面介绍。
subst x'。
重写E中的Hoverride_eq。
区别对待
Qed。
12月底。

这个引理说,如果有一种方法可以实现你要求的
X
,那么你可以测试
X
的两个元素
X
X'
是否相等,除了在
true
情况下得到的相等的证明实际上是
x=x'

的双重否定的证明是
x上的相等是可判定的吗?如果不是这样,可能无法定义这样一个
g
,但您始终可以定义一个关系
X->bool->Prop
I在X上使用“基本”等式(=)。例如,如果X是从nat到nat的函数集,
forall n,fn=gn
并不意味着
f=g
是先验的。X上的等式是可判定的吗?如果不是这样,可能无法定义这样一个
g
,但您可以始终定义一个关系
X->bool->Prop
我在X上使用“基本”等式(=)。例如,如果X是从nat到nat的函数集,
对于所有n,fn=gn
并不意味着先验的
f=g