Я просто хочу сделать k0 равным 1/2 * k, и поэтому я полагаю, что это имеет смысл, но я не могу этого сделать.
Существует функция с именем Nat.div2
, которая делит натуральное число на 2. Запуск Search Nat.div2.
Nat.le_div2: forall n : nat, Nat.div2 (S n) <= n
Nat.lt_div2: forall n : nat, 0 < n -> Nat.div2 n < n
Nat.div2_decr: forall a n : nat, a <= S n -> Nat.div2 a <= n
Nat.div2_wd: Morphisms.Proper (Morphisms.respectful eq eq) Nat.div2
Nat.div2_spec: forall a : nat, Nat.div2 a = Nat.shiftr a 1
Nnat.N2Nat.inj_div2: forall a : N, N.to_nat (N.div2 a) = Nat.div2 (N.to_nat a)
Nnat.Nat2N.inj_div2: forall n : nat, N.of_nat (Nat.div2 n) = N.div2 (N.of_nat n)
Nat.div2_double: forall n : nat, Nat.div2 (2 * n) = n
Nat.div2_div: forall a : nat, Nat.div2 a = a / 2
Nat.div2_succ_double: forall n : nat, Nat.div2 (S (2 * n)) = n
Nat.div2_odd: forall a : nat, a = 2 * Nat.div2 a + Nat.b2n (Nat.odd a)
Nat.div2_bitwise:
forall (op : bool -> bool -> bool) (n a b : nat),
Nat.div2 (Nat.bitwise op (S n) a b) = Nat.bitwise op n (Nat.div2 a) (Nat.div2 b)
Из них наиболее многообещающим кажется Nat.div2_odd: forall a : nat, a = 2 * Nat.div2 a + Nat.b2n (Nat.odd a)
. Если вы pose proof
эту лемму, вы можете destruct (Nat.odd a)
и использовать simpl
, чтобы получить либо a = 2 * Nat.div2 a
, либо a = 2 * Nat.div2 a + 1
, для любого a
, который вы выберете.
Это может не дать вам решения напрямую (я не уверен, что установка k0
в k / 2
- правильное решение), но если это не так, вы должны убедиться, что можете придумать, как доказать это факт на бумаге, прежде чем попробовать это в Coq. Coq очень хорошо убеждается, что вы не делаете никаких скачков логики, которые вам не разрешено делать; крайне плохо помочь вам понять, как доказать факт, который вы еще не знаете, как доказать.