在某一点更改功能

时间:2014-11-24 13:55:00

标签: coq

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

如何为y!= x定义g : X -> bool g x = trueg y = f y

2 个答案:

答案 0 :(得分:3)

在您回答我的评论后,我认为您无法定义"功能" g,因为您需要一种建设性的方式来区分xX类型的其他实例。但是,您可以定义两者之间的关系,如果您获得可判定性,则可以将其转换为函数。 类似的东西:

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'的双重否定。