我有两个元素f : X -> bool
和x : X
。
如何为y!= x定义g : X -> bool
g x = true
和g y = f y
。
答案 0 :(得分:3)
在您回答我的评论后,我认为您无法定义"功能" 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.
答案 1 :(得分:1)
只是补充了Vinz的答案,没有办法为任意X
定义这样的函数,因为它暗示X
具有几乎可判定的&#34;&#34 ;平等:
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.
这个引理说,如果有办法按照X
的要求进行操作,那么可以测试x
的两个元素x'
和X
是相等的,除了在true
案例中得到的平等证明实际上证明了x = x'
的双重否定。