Я пытаюсь доказать простые свойства поля непосредственно из аксиом поля. После некоторых экспериментов с нативной полевой поддержкой Coq ( как этот ) я решил, что лучше просто записать 10 аксиом и сделать их самодостаточными. Я столкнулся с трудностью, когда мне нужно было использовать rewrite
с моим собственным оператором ==
, который, естественно, не работал. Я понимаю, что должен добавить несколько аксиом, что мои ==
рефлексивны, симметричны и транзитивны, но мне было интересно, хватит ли этого? или, может быть, есть еще более простой способ использования rewrite
с пользовательским ==
? Вот мой код Coq:
Variable (F:Type).
Variable (zero:F).
Variable (one :F).
Variable (add: F -> F -> F).
Variable (mul: F -> F -> F).
Variable (opposite: F -> F).
Variable (inverse : F -> F).
Variable (eq: F -> F -> Prop).
Axiom add_assoc: forall (a b c : F), (eq (add (add a b) c) (add a (add b c))).
Axiom mul_assoc: forall (a b c : F), (eq (mul (mul a b) c) (mul a (mul b c))).
Axiom add_comm : forall (a b : F), (eq (add a b) (add b a)).
Axiom mul_comm : forall (a b : F), (eq (mul a b) (mul b a)).
Axiom distr1 : forall (a b c : F), (eq (mul a (add b c)) (add (mul a b) (mul a c))).
Axiom distr2 : forall (a b c : F), (eq (mul (add a b) c) (add (mul a c) (mul b c))).
Axiom add_id1 : forall (a : F), (eq (add a zero) a).
Axiom mul_id1 : forall (a : F), (eq (mul a one) a).
Axiom add_id2 : forall (a : F), (eq (add zero a) a).
Axiom mul_id2 : forall (a : F), (eq (mul one a) a).
Axiom add_inv1 : forall (a : F), exists b, (eq (add a b) zero).
Axiom add_inv2 : forall (a : F), exists b, (eq (add b a) zero).
Axiom mul_inv1 : forall (a : F), exists b, (eq (mul a b) one).
Axiom mul_inv2 : forall (a : F), exists b, (eq (mul b a) one).
(*******************)
(* Field notations *)
(*******************)
Notation "0" := zero.
Notation "1" := one.
Infix "+" := add.
Infix "*" := mul.
(*******************)
(* Field notations *)
(*******************)
Infix "==" := eq (at level 70, no associativity).
Lemma mul_0_l: forall v, (0 * v == 0).
Proof.
intros v.
specialize add_id1 with (0 * v).
intros H.
На данный момент у меня есть предположение H : 0 * v + 0 == 0 * v
и цель
0 * v == 0
. Когда я попытался rewrite H
, это, естественно, не удается.