Zulip Chat Archive

Stream: new members

Topic: How to increase memory threshold in code


Lars Ericson (Dec 24 2020 at 00:18):

I am in code on ubuntu. I get this message:

excessive memory consumption detected at 'expression equality test' (potential solution: increase memory consumption threshold)

How do I increase the memory consumption threshold when lean is getting started up under the hood of code?

Yakov Pechersky (Dec 24 2020 at 00:22):

Ctrl-, to bring up settings. Search for Lean memory. Mine is set at 8K.

Yakov Pechersky (Dec 24 2020 at 00:22):

Lean: Memory Limit is the setting

Yakov Pechersky (Dec 24 2020 at 00:23):

but whatever term you're trying to #reduce, the amount you increase to might not be sufficient

Lars Ericson (Dec 24 2020 at 00:28):

Thanks @Yakov Pechersky I am trying to do a proof of the theorem that "The cancellation law of multiplication for integral domains is equivalent in a commutative ring to the assertion that a product of nonzero factors is not 0."

I am translating this as (c ≠ 0 → c*a = c*b → a = b) ↔ (a ≠ 0 → b ≠ 0 → a * b ≠ 0) . With this translation, at a certain point, library_search and suggest run out of memory. I don't know how to prove it from the comm_ring axioms:

import algebra.ring.basic
import tactic

universe u

variables {α : Type u} [comm_ring α] {a b c z x₁ x₂ :  α}

/- Theorem 1. The cancellation law of multiplication for integral domains
is equivalent in a commutative ring to the assertion that
a product of nonzero factors is not 0. -/

lemma lemma_1_LR: (c  0  c*a = c*b  a = b)   (a  0  b  0  a * b  0) :=
begin
  intro h1,
  intro h2,
  intro h3,
  intro h4,
  by_cases h5 : c  0,
  have h6 := h1 h5,
  by_cases h7 : c * a = c * b,
  have h8 := h6 h7,
  sorry,
  sorry,
  sorry,
end

lemma lemma_1_RL: (a  0  b  0  a * b  0)  (c  0  c*a = c*b  a = b)  :=
begin
  intro h1,
  intro h2,
  intro h3,
  by_cases h4 : a  0,
  have h5 := h1 h4,
  by_cases h6 : c*a = c*b,
  by_cases h7 : b  0,
  have h8 := h5 h7,
  sorry,
  sorry,
  sorry,
  sorry,
end

theorem theorem_1 : (c  0  c*a = c*b  a = b)  (a  0  b  0  a * b  0) :=
begin
  split,
  exact lemma_1_LR,
  exact lemma_1_RL,
end

Mario Carneiro (Dec 24 2020 at 01:11):

your theorems need additional forall quantifications on each side

Lars Ericson (Dec 24 2020 at 01:12):

Thanks @Mario Carneiro , I will refine.

Mario Carneiro (Dec 24 2020 at 01:12):

theorem theorem_1 :
  ( a b c : α, c  0  c*a = c*b  a = b) 
  ( a b : α, a  0  b  0  a * b  0) :=
sorry

Mario Carneiro (Dec 24 2020 at 01:13):

generally when it says you should increase your memory limit, you should ignore the suggestion because something else is going wrong

Mario Carneiro (Dec 24 2020 at 01:20):

Here's a partial proof to help you get started:

theorem theorem_1 :
  ( a b c : α, c  0  c*a = c*b  a = b) 
  ( a b : α, a  0  b  0  a * b  0) :=
begin
  split,
  { intros H a b ha hb ab,
    refine hb (H _ _ _ ha _),
    sorry },
  { intros H a b c hc e,
    rw  sub_eq_zero at e ,
    refine by_contra (λ h, _),
    refine H c (a - b) hc h _,
    sorry },
end

Mario Carneiro (Dec 24 2020 at 01:22):

For some reason using by_contra h instead of refine by_contra (λ h, _), is taking a really long time for me (but it doesn't time out or run out of memory). Possibly something weird ended up in the typeclass search for decidable_eq A

Mario Carneiro (Dec 24 2020 at 01:40):

minimized:

import algebra.ring.basic
import data.set.basic

lemma foo (p) [decidable p] : true := trivial

set_option trace.class_instances true
example {α} [semigroup α] (a : α) : a = a :=
by do
  tgt  tactic.target,
  tactic.mk_mapp `foo [some tgt, none]

You can also play with the import set to make it take longer; import tactic is quite bad.

@Gabriel Ebner Could you take a look at whether the typeclass problem is reasonably sized here? It seems like the decision to make linear_order inherit from decidable_eq means that the decidability problem gets quite large, and while caching seems to help I see a lot of repetition from a cursory glance at the log.

Lars Ericson (Dec 24 2020 at 02:04):

Thanks again @Mario Carneiro here is the finished Theorem 1:

/- Theorem 1. The cancellation law of multiplication for integral domains
is equivalent in a commutative ring to the assertion that
a product of nonzero factors is not 0. -/

lemma left_distrib_minus : c * a - c * b = c * (a - b) :=
begin
  ring,
end

theorem theorem_1 :
  ( a b c : α, c  0  c*a = c*b  a = b) 
  ( a b : α, a  0  b  0  a * b  0) :=
begin
  split,
  { intros H a b ha hb ab,
    refine hb (H _ _ _ ha _),
    have hc := mul_zero a,
    rw hc,
    rw ab,
  },
  { intros H a b c hc e,
    rw  sub_eq_zero at e ,
    refine by_contra (λ h, _),
    refine H c (a - b) hc h _,
    rw left_distrib_minus at e,
    exact e,
  },
end

Mario Carneiro (Dec 24 2020 at 02:06):

left_distrib_minus has a name, can you find it?

Lars Ericson (Dec 24 2020 at 02:39):

@Mario Carneiro left_distrib doesn't quite fit because it is phrased for a+b and this is a-b and if you instantiate it you get a+(-b) which doesn't quite match the hypothesis set. I played around with it and ended up having to use a different lemma which instead of sugaring ring, sugars rfl:

lemma deminus_plus (a b : α): a + -b = a - b := rfl

theorem theorem_1 :
  ( a b c : α, c  0  c*a = c*b  a = b) 
  ( a b : α, a  0  b  0  a * b  0) :=
begin
  split,
  { intros H a b ha hb ab,
    refine hb (H _ _ _ ha _),
    have hc := mul_zero a,
    rw hc,
    rw ab,
  },
  { intros H a b c hc e,
    rw  sub_eq_zero at e ,
    refine by_contra (λ h, _),
    refine H c (a - b) hc h _,
    have hd := left_distrib c a (-b),
    have he := deminus_plus a b,
    rw he at hd,
    have hf := norm_num.mul_pos_neg c b (c * b) rfl,
    rw hf at hd,
    have hg := deminus_plus (c*a) (c*b),
    rw hg at hd,
    rw hd,
    exact e,
  },
end

I don't know how to make use of rfl "inline" as a tactic in this case. If you can help me rewrite one of the deminus_plus lines to use rfl then I can finish it.

Mario Carneiro (Dec 24 2020 at 02:40):

Recall the #naming convention

Mario Carneiro (Dec 24 2020 at 02:40):

what would be the name of a lemma that combines multiplication and subtraction?

Mario Carneiro (Dec 24 2020 at 02:42):

deminus_plus also has a name that the naming convention will guide you to

Mario Carneiro (Dec 24 2020 at 02:43):

If you want to prove the have he := deminus_plus ... lines using rfl you will have to state the expected type as in have he : <type> := rfl

Lars Ericson (Dec 24 2020 at 02:46):

I have one hypotheses I need to edit:

hd: c * (a + -b) = c * a + c * -b

to become

hd: c * (a - b) = c * a - c * b

I'll look for add_neg names or plus_neg names.

Lars Ericson (Dec 24 2020 at 02:54):

Ah docs#sub_eq_add_neg.

Lars Ericson (Dec 24 2020 at 03:02):

DONE:

import algebra.ring.basic
import tactic

universe u

variables {α : Type u} [comm_ring α]

/- Theorem 1. The cancellation law of multiplication for integral domains
is equivalent in a commutative ring to the assertion that
a product of nonzero factors is not 0. -/

theorem theorem_1 :
  ( a b c : α, c  0  c*a = c*b  a = b) 
  ( a b : α, a  0  b  0  a * b  0) :=
begin
  split,
  { intros H a b ha hb ab,
    refine hb (H _ _ _ ha _),
    have hc := mul_zero a,
    rw hc,
    rw ab,
  },
  { intros H a b c hc e,
    rw  sub_eq_zero at e ,
    refine by_contra (λ h, _),
    refine H c (a - b) hc h _,
    have hd := left_distrib c a (-b),
    have he := sub_eq_add_neg a b,
    rw  he at hd,
    have hf := norm_num.mul_pos_neg c b (c * b) rfl,
    rw hf at hd,
    have hg := sub_eq_add_neg (c*a) (c*b),
    rw  hg at hd,
    rw hd,
    exact e,
  },
end

Mario Carneiro (Dec 24 2020 at 03:34):

I'll look for add_neg names or plus_neg names.

Always add, never plus

Mario Carneiro (Dec 24 2020 at 03:36):

Your original proof used a theorem a * (b - c) = a * b - a * c. Have you found that lemma yet?

Lars Ericson (Dec 24 2020 at 04:06):

The code underneath DONE above is pure matlib, there is no extra lemma. I use the built-in left_distrib and built-in sub_eq_add_neg.

Mario Carneiro (Dec 24 2020 at 06:20):

You are proving this fact a * (b - c) = a * b - a * c in the middle of your proof, and you don't need to. It's good to get a sense for what to expect in the library, and a distribution lemma like this will certainly be in there. (Since you missed the naming hints, the name is docs#mul_sub.)


Last updated: Dec 20 2023 at 11:08 UTC