machine_utils.finz_lemmas

From Coq Require Import ssreflect.
From stdpp Require Import base numbers.
From machine_utils Require Import finz_base solve_finz.

Lemma finz_add_0 fb (a : finz fb) :
  (a + 0)%f = Some a.
Proof. solve_finz. Qed.

Lemma finz_add_0_default fb (a : finz fb) :
  (a ^+ 0)%f = a.
Proof. solve_finz. Qed.

Lemma InBounds_sub fb (b e b' e' a : finz fb) :
  SubBounds b e b' e'
  InBounds b' e' a
  InBounds b e a.
Proof. intros (? & ? & ?) [? ?]. unfold InBounds. solve_finz. Qed.

(* -- tests -- promote to lemmas if needed *)

Goal forall fb (a : finz fb),
  (a + 1)%f = None ->
  (a:Z) = (fb - 1)%Z.
Proof. solve_finz. Qed.

Goal forall fb (a : finz fb) (n m : Z),
  (0 <= n)%Z ->
  (0 <= m)%Z ->
  ((a ^+ n) ^+ m)%f = (a ^+ (n + m)%Z)%f.
Proof. solve_finz. Qed.

Goal forall fb (a a' : finz fb),
  (a + 1)%f = Some a'
  (a < a')%Z.
Proof. solve_finz. Qed.

Goal forall fb (a a' : finz fb) (i : Z),
  (i > 0)%Z
  (a + i)%f = Some a' (a < a')%Z.
Proof. solve_finz. Qed.

Goal forall fb (a a' : finz fb) (i : Z),
  (i >= 0)%Z
  (a + i)%f = Some a' (a <= a')%Z.
Proof. solve_finz. Qed.

Goal forall fb (a e : finz fb),
  (a < e)%Z a', (a + 1)%f = Some a'.
Proof. intros. zify_finz; eauto. exfalso. lia. lia. Qed.

Goal forall fb (a e : finz fb),
  (a < e)%Z -> a', (a + 1)%f = Some a'.
Proof. intros. zify_finz; eauto. exfalso. lia. lia. Qed.

Goal forall fb (a e a' : finz fb),
  (a < e)%Z (a + 1)%f = Some a' (e < a')%Z False.
Proof. solve_finz. Qed.

Goal forall fb (a e a' : finz fb),
  (a < e)%Z (a + 1)%f = Some a' (a' e)%Z.
Proof. solve_finz. Qed.

Goal forall fb (a e a' : finz fb),
  (a + 1)%f = Some a' (a < e)%Z (Z.abs_nat (e - a) - 1) = (Z.abs_nat (e - a')).
Proof. solve_finz. Qed.

Goal forall fb (a1 a2 a3 : finz fb) (z1 z2 : Z),
  (a1 + z1)%f = Some a2 (a2 + z2)%f = Some a3
  (a1 + (z1 + z2))%f = Some a3.
Proof. solve_finz. Qed.

Goal forall fb (a a' : finz fb) (z1 z2 : Z),
  (a + z1)%f = Some a'
  (a + (z1 + z2))%f = (a' + z2)%f.
Proof. solve_finz. Qed.

Goal forall fb (a1 a2 a3 : finz fb) (z1 z2 : Z),
  (a1 + z1)%f = Some a2 -> (a1 + z2)%f = Some a3 -> (z1 <= z2)%Z ->
  (a2 <= a3)%Z.
Proof. solve_finz. Qed.

Goal forall fb (a : finz fb) i k,
  (k >= 0)%Z -> (i >= 0)%Z ->
  (((a ^+ i) ^+ k)%f) =
  ((a ^+ (i + k)%Z)%f).
Proof. solve_finz. Qed.

Goal forall fb (a a' : finz fb),
  (a + 1)%f = Some a'
  (a + 1)%Z = a'.
Proof. solve_finz. Qed.

Goal forall fb (a a' : finz fb) i,
  (a + i)%f = Some a'
  (a + i)%Z = a'.
Proof. solve_finz. Qed.

Goal forall fb (a1 a2: finz fb) (z:Z),
      (a1 + z)%f = Some a2 (a2 + (- z))%f = Some a1.
Proof. solve_finz. Qed.