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
。