Есть ли способ найти переменную в Coq? Дано:

From Coq Require Import Reals.Reals. 

Definition f_of_x (x : R) : R := x + 1. 
Definition f_of_y (y : R) : R := y + 2.

Я хочу выразить

Definition x_of_y (y : R) : R :=

Как что-то вроде solve for x in f_of_x = f_of_y. я собираюсь использовать тактический язык, чтобы потом перемешивать термины. В конечном итоге я хочу получить правильное пригодное для использования определение y + 1., я думаю, хочу использовать свое определение:

Compute x_of_y 2. (* This would yield 3 if R was tractable or if I was using nat *)

Альтернатива - сделать это вручную с помощью карандаша или бумаги, а затем только проверить мою работу с Coq. Это единственный способ?

coq
0
user2183336 16 Июл 2020 в 18:01

1 ответ

Лучший ответ

Если я правильно понимаю, то, что вы хотите выразить, - это наличие решения уравнения

x + 3 = x + 2

Если это так, вы можете указать это в coq как

Lemma solution :
  exists x, x + 3 = x + 2.

Если бы это было что-то решаемое, например x + 2 = 2 * x, вы могли бы решить его как

Lemma solution :
  exists x, x + 2 = 2 * x.
Proof.
  exists 2. reflexivity.
Qed.

Но тогда, конечно, нет решений для x + 3 = x + 2. Если вы хотите вместо этого решение, с фиксированным значением y

x + 3 = y + 2

Вы должны количественно определить более y:

Lemma solution :
  forall y, exists x, x + 1 = y + 2.
Proof.
  intro y.
  eexists. (* Here I'm saying I want to prove the equality and fill in the x later *)
  eapply plus_S_inj.
  rewrite plus_0.
  reflexivity.
Defined.

Print solution. (* You will see the y + 1 here *)

Здесь я предполагаю некоторые леммы, которые помогают мне манипулировать числами:

Lemma plus_S_inj :
  forall x y z t,
    x + z = y + t ->
    x + (S z) = y + (S t).
Admitted.

Lemma plus_0 :
  forall x,
    x + 0 = x.
Admitted.

У вас, вероятно, есть похожие леммы для вашего понятия R (я не знаю, что это такое, поэтому не могу идти дальше).

1
Théo Winterhalter 16 Июл 2020 в 20:16