Вы хотите использовать лемму beq_nat_true
.
Если я выполню
Require Import Coq.Arith.Arith.
Search "=?".
Я вижу
Nat.eqb_refl: forall x : nat, (x =? x) = true
beq_nat_refl: forall n : nat, true = (n =? n)
Nat.eqb_sym: forall x y : nat, (x =? y) = (y =? x)
Nat.eqb_spec: forall x y : nat, Bool.reflect (x = y) (x =? y)
beq_nat_eq: forall n m : nat, true = (n =? m) -> n = m
beq_nat_true: forall n m : nat, (n =? m) = true -> n = m
Nat.eqb_eq: forall n m : nat, (n =? m) = true <-> n = m
beq_nat_false: forall n m : nat, (n =? m) = false -> n <> m
Nat.eqb_neq: forall x y : nat, (x =? y) = false <-> x <> y
Nat.eqb_compat:
Morphisms.Proper (Morphisms.respectful eq (Morphisms.respectful eq eq))
Nat.eqb
Nat.eqb_compare:
forall x y : nat, (x =? y) = match x ?= y with
| Eq => true
| _ => false
end
Nat.bit0_eqb: forall a : nat, Nat.testbit a 0 = (a mod 2 =? 1)
Nat.pow2_bits_eqb: forall n m : nat, Nat.testbit (2 ^ n) m = (n =? m)
Nat.setbit_eqb:
forall a n m : nat,
Nat.testbit (Nat.setbit a n) m = ((n =? m) || Nat.testbit a m)%bool
Nat.clearbit_eqb:
forall a n m : nat,
Nat.testbit (Nat.clearbit a n) m = (Nat.testbit a m && negb (n =? m))%bool
Nat.testbit_eqb: forall a n : nat, Nat.testbit a n = ((a / 2 ^ n) mod 2 =? 1)
Вы также можете сделать
Search ((_ =? _) = true).
, которая дает вам леммы, которые содержат подтерм, соответствующий шаблону ((_ =? _) = true)
, который является подмножеством
Nat.eqb_refl: forall x : nat, (x =? x) = true
beq_nat_true: forall n m : nat, (n =? m) = true -> n = m
Nat.eqb_eq: forall n m : nat, (n =? m) = true <-> n = m
Из них он выглядит как
beq_nat_true: forall n m : nat, (n =? m) = true -> n = m
делает что хочешь.Вы должны быть в состоянии решить вашу цель с любым из
now apply beq_nat_true.
auto using beq_nat_true.
apply beq_nat_true, e0.
apply beq_nat_true in e0; exact e0.
apply beq_nat_true in e0; subst; reflexivity.
now apply beq_nat_true in e0.
Если вы хотите превратить это в тактику, вы можете написать что-то вроде
Ltac beq_nat_to_eq :=
repeat match goal with
| [ H : (_ =? _) = true |- _ ] => apply beq_nat_true in H
| [ H : (_ =? _) = false |- _ ] => apply beq_nat_false in H
end.