Ideals

Ideals as a ring-like algebra.


Require Import Stdlib.Arith.Arith.
Import List.ListNotations.
Require Import Utf8 Core Misc Utils IterAdd.


Record ideal {T} {ro : ring_like_op T} := mk_ip
  { i_subset : T Prop;
    i_zero : i_subset 0%L;
    i_add x y : i_subset x i_subset y i_subset (x + y)%L;
    i_mul_l t x : i_subset x i_subset (t × x)%L;
    i_mul_r x t : i_subset x i_subset (x × t)%L }.

Declare Scope ideal_scope.
Delimit Scope ideal_scope with I.
Bind Scope ideal_scope with ideal.

Arguments ideal T {ro}.
Arguments i_subset {T ro} i%_I a%_L.

Notation "x '∈' I" := (i_subset I x) (at level 70) : ideal_scope.

Class ideal_ctx T {ro : ring_like_op T} :=
  { ix_os : rngl_has_opp_or_psub T = true }.

Ltac destruct_ix :=
  set (Hos := ix_os).


Theorem forall_pair {A B} {P : A B Prop} :
  ( a b, P a b) ( ab, P (fst ab) (snd ab)).

Theorem forall_pair_in {A B P l} :
  ( ab : A × B, (fst ab, snd ab) l P ab)
  ( ab : A × B, ab l P ab).

Theorem forall_in_seq {A B} da db la lb (P : A B Prop) :
  length la = length lb
  ( i,
   i List.seq 0 (length la) P (List.nth i la da) (List.nth i lb db))
  ( lab, la = List.map fst lab lb = List.map snd lab
    ab, ab lab P (fst ab) (snd ab)).
Require Import Stdlib.Logic.PropExtensionality.
Require Import Stdlib.Logic.FunctionalExtensionality.
Section a.

Context {T : Type}.
Context {ro : ring_like_op T}.
Context {rp : ring_like_prop T}.
Context {ix : ideal_ctx T}.


Theorem I_zero_add a b : a = 0%L b = 0%L (a + b = 0)%L.

Theorem I_zero_mul_l a b : b = 0%L (a × b = 0)%L.

Theorem I_zero_mul_r a b : a = 0%L (a × b = 0)%L.


Definition I_add_subset I J z :=
   x y, (x I)%I (y J)%I z = (x + y)%L.

Arguments I_add_subset (I J)%_I z%_L.

Theorem I_add_zero I J : I_add_subset I J 0%L.

Theorem I_add_add I J :
   x y, I_add_subset I J x I_add_subset I J y I_add_subset I J (x + y)%L.

Theorem I_add_mul_l I J :
   x y, I_add_subset I J y I_add_subset I J (x × y).

Theorem I_add_mul_r I J :
   x y, I_add_subset I J x I_add_subset I J (x × y).


Definition I_mul_subset_prop I J z lxy :=
  length lxy 0
  ( x y, (x, y) lxy (x I)%I (y J)%I)
  z = ((x, y) lxy), x × y.

Definition I_mul_subset I J z := lxy, I_mul_subset_prop I J z lxy.

Arguments I_mul_subset (I J)%_I z%_L.

Theorem I_mul_zero I J : I_mul_subset I J 0%L.

Theorem I_mul_add I J :
   x y, I_mul_subset I J x I_mul_subset I J y I_mul_subset I J (x + y)%L.

Theorem I_mul_mul_l I J :
   x y, I_mul_subset I J y I_mul_subset I J (x × y).

Theorem I_mul_mul_r I J :
   x y, I_mul_subset I J x I_mul_subset I J (x × y).


Definition I_zero : ideal T :=
  {| i_subset a := a = 0%L;
     i_zero := eq_refl;
     i_add := I_zero_add;
     i_mul_l := I_zero_mul_l;
     i_mul_r := I_zero_mul_r |}.

Definition I_one : ideal T :=
  {| i_subset a := True;
     i_zero := I;
     i_add _ _ _ _ := I;
     i_mul_l _ _ _ := I;
     i_mul_r _ _ _ := I |}.

Definition I_add (I J : ideal T) : ideal T :=
  {| i_subset := I_add_subset I J;
     i_zero := I_add_zero I J;
     i_add := I_add_add I J;
     i_mul_l := I_add_mul_l I J;
     i_mul_r := I_add_mul_r I J |}.

Definition I_mul (I J : ideal T) : ideal T :=
  {| i_subset := I_mul_subset I J;
     i_zero := I_mul_zero I J;
     i_add := I_mul_add I J;
     i_mul_l := I_mul_mul_l I J;
     i_mul_r := I_mul_mul_r I J |}.


Definition I_ring_like_op : ring_like_op (ideal T) :=
  {| rngl_zero := I_zero;
     rngl_one := I_one;
     rngl_add := I_add;
     rngl_mul := I_mul;
     rngl_opt_opp_or_psub := None;
     rngl_opt_inv_or_pdiv := None;
     rngl_opt_is_zero_divisor := Some (λ _, True);
     rngl_opt_eq_dec := None;
     rngl_opt_leb := None |}.

End a.

Notation "0" := I_zero : ideal_scope.
Notation "1" := I_one : ideal_scope.
Notation "I + J" := (I_add I J) : ideal_scope.
Notation "I * J" := (I_mul I J) : ideal_scope.

Section a.

Context {T : Type}.
Context {ro : ring_like_op T}.
Context {rp : ring_like_prop T}.
Context {ix : ideal_ctx T}.

Theorem eq_ideal_eq : I J,
  i_subset I = i_subset J
   I = J.

Theorem I_add_subset_comm I J z : I_add_subset I J z = I_add_subset J I z.
Theorem I_add_comm : I J, (I + J)%I = (J + I)%I.

Theorem I_add_subset_assoc_l I J K x z :
  (x I)%I (z J + K)%I I_add_subset (I + J) K (x + z)%L.

Theorem I_add_subset_assoc I J K x :
  I_add_subset I (J + K) x = I_add_subset (I + J) K x.
Theorem I_add_assoc : I J K, (I + (J + K))%I = ((I + J) + K)%I.

Theorem I_add_subset_0_l I x : I_add_subset 0 I x = (x I)%I.
Theorem I_add_0_l I : (0 + I)%I = I.

Theorem forall_exists_exists_forall {A B} (da : A) (db : B) P Q la :
  ( a, a la P a n, Q a n)
   lb, length lb = length la
     i,
    i List.seq 0 (length lb)
     P (List.nth i la da) Q (List.nth i la da) (List.nth i lb db).
Theorem I_subset_mul_assoc_l :
   I J K x y z, (x I y J z K x × y × z I × J × K)%I.

Theorem I_subset_mul_assoc_r :
   I J K x y z, (x I y J z K x × y × z I × (J × K))%I.

Theorem I_subset_sum_mul_assoc_l {A} :
   I J K li (f g h : A T),
  ( i, i li (f i I)%I)
   ( i, i li (g i J)%I)
   ( i, i li (h i K)%I)
   ( (i li), f i × g i × h i I × J × K)%I.

Theorem I_subset_sum_mul_assoc_r {A} :
   I J K li (f g h : A T),
  ( i, i li (f i I)%I)
   ( i, i li (g i J)%I)
   ( i, i li (h i K)%I)
   ( (i li), f i × g i × h i I × (J × K))%I.

Theorem I_subset_sum_sum_mul_assoc_l {A B} :
   I J K li lj (f g h : A B T),
  ( i j, i li j lj i (f i j I)%I)
   ( i j, i li j lj i (g i j J)%I)
   ( i j, i li j lj i (h i j K)%I)
   ( (i li), (j lj i), f i j × g i j × h i j I × J × K)%I.

Theorem I_subset_sum_sum_mul_assoc_r {A B} :
   I J K li lj (f g h : A B T),
  ( i j, i li j lj i (f i j I)%I)
   ( i j, i li j lj i (g i j J)%I)
   ( i j, i li j lj i (h i j K)%I)
   ( (i li), (j lj i), f i j × g i j × h i j I × (J × K))%I.

Theorem I_subset_mul_assoc_l_mul_assoc_r I J K :
   z, (z I × (J × K) z (I × J) × K)%I.
Theorem I_subset_mul_assoc_l_mul_assoc_l I J K :
   z, (z (I × J) × K z I × (J × K))%I.
Theorem I_mul_subset_assoc I J K x :
  I_mul_subset I (J × K) x = I_mul_subset (I × J) K x.

Theorem I_mul_assoc I J K : (I × (J × K))%I = ((I × J) × K)%I.

Theorem I_mul_subset_1_l I : x, I_mul_subset 1 I x = (x I)%I.
Theorem I_mul_1_l : I : ideal T, (1 × I)%I = I.

Theorem I_mul_subset_add_distr_l_1 I J K :
   t, (t I × (J + K) t I × J + I × K)%I.
Theorem I_mul_subset_add_distr_r_1 I J K :
   t, (t (I + J) × K t I × K + J × K)%I.
Theorem I_mul_subset_add_distr_l_2_lemma I J K lab :
  length lab 0
   ( x y, (x, y) lab (x I)%I (y J)%I)
   ( ((x, y) lab), x × y I × (J + K))%I.

Theorem I_mul_subset_add_distr_r_2_lemma I J K lab :
  length lab 0
   ( x y : T, (x, y) lab (x I)%I (y K)%I)
   ( ((x, y) lab), x × y (I + J) × K)%I.

Theorem I_mul_subset_add_distr_l_2 I J K :
   t, (t I × J + I × K t I × (J + K))%I.
Theorem I_mul_subset_add_distr_r_2 I J K :
   t, (t I × K + J × K t (I + J) × K)%I.
Theorem I_mul_subset_add_distr_l I J K x :
  I_mul_subset I (J + K) x = I_add_subset (I × J) (I × K) x.

Theorem I_mul_subset_add_distr_r I J K x :
  I_mul_subset (I + J) K x = I_add_subset (I × K) (J × K) x.

Theorem I_mul_add_distr_l I J K : (I × (J + K))%I = (I × J + I × K)%I.

Theorem I_mul_add_distr_r I J K : ((I + J) × K)%I = (I × K + J × K)%I.

Theorem I_mul_subset_comm :
  rngl_mul_is_comm T = true
   I J x, I_mul_subset I J x = I_mul_subset J I x.
Theorem I_opt_mul_comm :
  if rngl_mul_is_comm T then I J : ideal T, (I × J)%I = (J × I)%I
  else not_applicable.

Theorem I_mul_subset_1_r I : x, I_mul_subset I 1 x = (x I)%I.
Theorem I_opt_mul_1_r :
  if rngl_mul_is_comm T then not_applicable else I : ideal T, (I × 1)%I = I.

Theorem I_opt_mul_add_distr_r :
  if rngl_mul_is_comm T then not_applicable
  else I J K : ideal T, ((I + J) × K)%I = (I × K + J × K)%I.

Theorem I_opt_integral I J :
  (I × J)%I = 0%I I = 0%I J = 0%I True True.

Theorem I_characteristic_prop :
  let roi := I_ring_like_op in
  if Nat.b2n (rngl_characteristic T =? 1) =? 0 then
     i : nat, rngl_of_nat (S i) 0%L
  else
   ( i : nat,
      0 < i < Nat.b2n (rngl_characteristic T =? 1) rngl_of_nat i 0%L)
    rngl_of_nat (Nat.b2n (rngl_characteristic T =? 1)) = 0%L.

Definition I_ring_like_prop : ring_like_prop (ideal T) :=
  let roi := I_ring_like_op in
  {| rngl_mul_is_comm := rngl_mul_is_comm T;
     rngl_is_archimedean := false;
     rngl_is_alg_closed := false;
     rngl_characteristic := Nat.b2n (rngl_characteristic T =? 1);
     rngl_add_comm := I_add_comm;
     rngl_add_assoc := I_add_assoc;
     rngl_add_0_l := I_add_0_l;
     rngl_mul_assoc := I_mul_assoc;
     rngl_mul_1_l := I_mul_1_l;
     rngl_mul_add_distr_l := I_mul_add_distr_l;
     rngl_opt_mul_comm := I_opt_mul_comm;
     rngl_opt_mul_1_r := I_opt_mul_1_r;
     rngl_opt_mul_add_distr_r := I_opt_mul_add_distr_r;
     rngl_opt_add_opp_diag_l := NA;
     rngl_opt_add_sub := NA;
     rngl_opt_sub_add_distr := NA;
     rngl_opt_mul_inv_diag_l := NA;
     rngl_opt_mul_inv_diag_r := NA;
     rngl_opt_mul_div := NA;
     rngl_opt_integral := I_opt_integral;
     rngl_opt_alg_closed := NA;
     rngl_opt_ord := NA;
     rngl_opt_archimedean := NA;
     rngl_characteristic_prop := I_characteristic_prop |}.

End a.

Section a.

Context {T : Type}.
Context {ro : ring_like_op T}.
Context {rp : ring_like_prop T}.
Context {ix : ideal_ctx T}.


Axiom i_subset_incl_dec : I J,
  { x, i_subset I x i_subset J x } +
  { ¬ x, i_subset I x i_subset J x }.

Definition I_leb (I J : ideal T) := bool_of_sumbool (i_subset_incl_dec I J).

Notation "I '⊂' J" := (i_subset_incl_dec I J) (at level 70) : ideal_scope.
Notation "I ≤ J" := (I_leb I J) : ideal_scope.

Definition I_ring_like_op' : ring_like_op (ideal T) :=
  {| rngl_zero := I_zero;
     rngl_one := I_one;
     rngl_add := I_add;
     rngl_mul := I_mul;
     rngl_opt_opp_or_psub := None;
     rngl_opt_inv_or_pdiv := None;
     rngl_opt_is_zero_divisor := Some (λ _, True);
     rngl_opt_eq_dec := None;
     rngl_opt_leb := Some (I_leb, false) |}.

Theorem I_ord_le_dec I J : {(I J)%I = true} + {(I J)%I true}.

Theorem I_ord_le_refl I : (I I)%I = true.

Theorem I_ord_le_antisymm I J : (I J)%I = true (J I)%I = true I = J.

Theorem I_ord_le_trans I J K :
  (I J)%I = true (J K)%I = true (I K)%I = true.

Theorem I_ord_mul_le_compat_nonneg I J K L :
  (0 I)%I = true (I K)%I = true
   (0 J)%I = true (J L)%I = true
   (I × J K × L)%I = true.

Theorem I_ord_mul_le_compat_nonpos I J K L :
  (K I)%I = true (I 0)%I = true
   (L J)%I = true (J 0)%I = true
   (I × J K × L)%I = true.

Definition I_ring_like_ord' : ring_like_ord (ideal T) :=
  let roi := I_ring_like_op' in
  {| rngl_ord_le_refl := I_ord_le_refl;
     rngl_ord_le_antisymm := I_ord_le_antisymm;
     rngl_ord_le_trans := I_ord_le_trans;
     rngl_ord_add_le_mono_l := NA;
     rngl_ord_mul_le_compat_nonneg := I_ord_mul_le_compat_nonneg;
     rngl_ord_mul_le_compat_nonpos := I_ord_mul_le_compat_nonpos;
     rngl_ord_le_dec := I_ord_le_dec;
     rngl_ord_total_prop := NA |}.

Definition I_ring_like_prop' : ring_like_prop (ideal T) :=
  let roi := I_ring_like_op' in
  {| rngl_mul_is_comm := rngl_mul_is_comm T;
     rngl_is_archimedean := false;
     rngl_is_alg_closed := false;
     rngl_characteristic := Nat.b2n (rngl_characteristic T =? 1);
     rngl_add_comm := I_add_comm;
     rngl_add_assoc := I_add_assoc;
     rngl_add_0_l := I_add_0_l;
     rngl_mul_assoc := I_mul_assoc;
     rngl_mul_1_l := I_mul_1_l;
     rngl_mul_add_distr_l := I_mul_add_distr_l;
     rngl_opt_mul_comm := I_opt_mul_comm;
     rngl_opt_mul_1_r := I_opt_mul_1_r;
     rngl_opt_mul_add_distr_r := I_opt_mul_add_distr_r;
     rngl_opt_add_opp_diag_l := NA;
     rngl_opt_add_sub := NA;
     rngl_opt_sub_add_distr := NA;
     rngl_opt_mul_inv_diag_l := NA;
     rngl_opt_mul_inv_diag_r := NA;
     rngl_opt_mul_div := NA;
     rngl_opt_integral := I_opt_integral;
     rngl_opt_alg_closed := NA;
     rngl_opt_ord := I_ring_like_ord';
     rngl_opt_archimedean := NA;
     rngl_characteristic_prop := I_characteristic_prop |}.

End a.

This page has been generated by coqdoc