Zulip Chat Archive

Stream: general

Topic: heq question


Kevin Buzzard (May 20 2018 at 18:53):

I wanted to get affine scheme = scheme finished today, but I have run into a problem whereby restricting to an open subset is not quite the same as restricting to the same not-defeq version of trhe open subset

Kevin Buzzard (May 20 2018 at 18:54):

Here's a fairly minimised question

Kevin Buzzard (May 20 2018 at 18:54):

import data.set
section oh_heq
parameters (α : Type) (U V W : set α)

lemma HU1 : U  V  W  U := set.subset.trans (set.inter_subset_left _ _) (set.inter_subset_left _ _)
lemma HV1 : U  V  W  V := set.subset.trans (set.inter_subset_left _ _) (set.inter_subset_right _ _)
lemma HW1 : U  V  W  W := set.inter_subset_right _ _
lemma HU2 : U  (V  W)  U := set.inter_subset_left _ _
lemma HV2 : U  (V  W)  V := set.subset.trans (set.inter_subset_right _ _) (set.inter_subset_left _ _)
lemma HW2 : U  (V  W)  W := set.subset.trans (set.inter_subset_right _ _) (set.inter_subset_right _ _)

example (F : set α  Type) [ Z : set α, group (F Z)]
(Fres :  X Y : set α, X  Y  F Y  F X)
(i : F U) (j : F V) (k : F W) :
Fres (U  V  W) U HU1 i * Fres (U  V  W) V HV1 j * Fres (U  V  W) W HW1 k
== Fres (U  (V  W)) U HU2 i * Fres (U  (V  W)) V HV2 j * Fres (U  (V  W)) W HW2 k
:= sorry

end oh_heq

Kevin Buzzard (May 20 2018 at 18:54):

Is that example true?

Kevin Buzzard (May 20 2018 at 18:55):

What's going on is that I am constructing an element of F(U cap V cap W)

Kevin Buzzard (May 20 2018 at 18:55):

and I'm constructing "the same" element of F(U cap (V cap W))

Kevin Buzzard (May 20 2018 at 18:55):

and I want them to be equal

Kevin Buzzard (May 20 2018 at 18:55):

or hequal

Kevin Buzzard (May 20 2018 at 18:56):

I feel like I ran into this sort of problem once before

Kevin Buzzard (May 20 2018 at 18:56):

and I tried some of the suggestions there

Kevin Buzzard (May 20 2018 at 18:56):

(before minimising)

Kevin Buzzard (May 20 2018 at 18:56):

congr turns the goal into 29 goals, not all of which are true

Kevin Buzzard (May 20 2018 at 18:57):

https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/dependent.20congr_arg.3F

Kevin Buzzard (May 20 2018 at 18:57):

was the old thread

Kevin Buzzard (May 20 2018 at 18:58):

simp fails to simplify

Kevin Buzzard (May 20 2018 at 18:58):

cc fails

Kevin Buzzard (May 20 2018 at 18:59):

hmm maybe I should tell simp that the two intersections are equal

Kevin Buzzard (May 20 2018 at 18:59):

 begin
have Hinter : U  V  W = U  (V  W) := by cc,
simp [Hinter],
end

Kevin Buzzard (May 20 2018 at 18:59):

fails to simplify

Kevin Buzzard (May 20 2018 at 19:00):

Is what I have written provable?

Kevin Buzzard (May 20 2018 at 19:00):

I don't understand how to use subst

Kevin Buzzard (May 20 2018 at 19:04):

Is there some crazy diamond thing going on?

Kevin Buzzard (May 20 2018 at 19:04):

Is the issue that I have put a ring structure on F (U cap V cap W)

Kevin Buzzard (May 20 2018 at 19:04):

and a ring structure on F(U cap (V cap W))

Kevin Buzzard (May 20 2018 at 19:04):

sorry -- a group structure

Kevin Buzzard (May 20 2018 at 19:04):

[in real life I have rings]

Kevin Buzzard (May 20 2018 at 19:05):

and a proof that U cap V cap W = U cap (V cap W)

Kevin Buzzard (May 20 2018 at 19:05):

but now there's the question as to whether the group structures get identified?

Kevin Buzzard (May 20 2018 at 19:05):

aargh

Kevin Buzzard (May 20 2018 at 19:05):

Am I in real trouble here??

Kevin Buzzard (May 20 2018 at 19:08):

begin
have Hinter : U  V  W = U  (V  W) := by cc,
refine eq.drec_on Hinter _,
congr,
-- now three goals:
-- ⊢ Fres (U ∩ V ∩ W) U HU1 i = Fres (U ∩ V ∩ W) U HU2 i
-- ⊢ Fres (U ∩ V ∩ W) V HV1 j = Fres (U ∩ V ∩ W) V HV2 j
-- ⊢ Fres (U ∩ V ∩ W) W HW1 k = Fres (U ∩ V ∩ W) W HW2 k
sorry,sorry,sorry
end

Kevin Buzzard (May 20 2018 at 19:08):

Possible progress

Chris Hughes (May 20 2018 at 19:11):

import data.set
section oh_heq
parameters (α : Type) (U V W : set α)

lemma HU1 : U  V  W  U := set.subset.trans (set.inter_subset_left _ _) (set.inter_subset_left _ _)
lemma HV1 : U  V  W  V := set.subset.trans (set.inter_subset_left _ _) (set.inter_subset_right _ _)
lemma HW1 : U  V  W  W := set.inter_subset_right _ _
lemma HU2 : U  (V  W)  U := set.inter_subset_left _ _
lemma HV2 : U  (V  W)  V := set.subset.trans (set.inter_subset_right _ _) (set.inter_subset_left _ _)
lemma HW2 : U  (V  W)  W := set.subset.trans (set.inter_subset_right _ _) (set.inter_subset_right _ _)

set_option trace.app_builder true

lemma T (F : set α  Type) [ Z : set α, group (F Z)]
(Fres :  X Y : set α, X  Y  F Y  F X)
(i : F U) (j : F V) (k : F W) (s t : set α)
(hst : s = t)
(hsU : s  U) (hsV : s  V) (hsW : s  W)
(htU : t  U) (htV : t  V) (htW : t  W) :
Fres s U hsU i * Fres s V hsV j * Fres s W hsW k
== Fres t U htU i * Fres t V htV j * Fres t W htW k := by subst hst

example (F : set α  Type) [ Z : set α, group (F Z)]
(Fres :  X Y : set α, X  Y  F Y  F X)
(i : F U) (j : F V) (k : F W) :
Fres (U  V  W) U HU1 i * Fres (U  V  W) V HV1 j * Fres (U  V  W) W HW1 k
== Fres (U  (V  W)) U HU2 i * Fres (U  (V  W)) V HV2 j * Fres (U  (V  W)) W HW2 k :=
T _ _ _ _ _ _ _ (set.inter_assoc _ _ _) HU1 HV1 HW1 HU2 HV2 HW2

Trouble is subst doesn't work very well when the expression is more complicated than s = t

Kevin Buzzard (May 20 2018 at 19:12):

aah we're back with subst

Kevin Buzzard (May 20 2018 at 19:12):

I wrote subst [random_thing] and I get an error I don't understand

Kevin Buzzard (May 20 2018 at 19:13):

so I gave up on subst very early

Kevin Buzzard (May 20 2018 at 19:13):

you're suggesting I persevere

Kevin Buzzard (May 20 2018 at 19:13):

My actual use case has rings and it's addition not multiplication

Kevin Buzzard (May 20 2018 at 19:13):

but it's very close to this

Chris Hughes (May 20 2018 at 19:13):

I used to use eq.drec_on with an explicit motive for things like this. That's really messy.

Kevin Buzzard (May 20 2018 at 19:13):

As you saw I tried eq.drec_on and made some progress

Kevin Buzzard (May 20 2018 at 19:14):

I perhaps need to learn how to use subst

Kevin Buzzard (May 20 2018 at 19:15):

You saw I proved Hinter : U ∩ V ∩ W = U ∩ (V ∩ W)

Kevin Buzzard (May 20 2018 at 19:15):

but subst Hinter, which somehow feels like what I want to do, gives me subst tactic failed, hypothesis 'Hinter' is not of the form (x = t) or (t = x)

Kevin Buzzard (May 20 2018 at 19:15):

That error message is really unhelpful

Kevin Buzzard (May 20 2018 at 19:15):

Does anyone know what it actually means?

Kevin Buzzard (May 20 2018 at 19:16):

Hinter looks like both of those forms to me :-)

Kevin Buzzard (May 20 2018 at 19:17):

begin
have Hinter : U  V  W = U  (V  W) := by cc,
subst Hinter, -- subst tactic failed, hypothesis 'Hinter' is not of the form (x = t) or (t = x)
sorry
end

Kevin Buzzard (May 20 2018 at 19:18):

How is that different to what you're doing?

Chris Hughes (May 20 2018 at 19:19):

I think it's basically that it has to be a really simple expression. x = t is fine, but anything like f x = t is not. I might be wrong about that.

Kevin Buzzard (May 20 2018 at 19:19):

You are telling me that subst won't work unless it literally is (one letter) = (one letter)?

Kevin Buzzard (May 20 2018 at 19:19):

Well at the end of the day you apparently proved it and I definitely didn't

Chris Hughes (May 20 2018 at 19:19):

I think so.

Kevin Buzzard (May 20 2018 at 19:19):

set_option trace.app_builder true

Kevin Buzzard (May 20 2018 at 19:19):

What was that all about?

Chris Hughes (May 20 2018 at 19:20):

In this code your goal shouldn't typecheck

begin
have Hinter : U  V  W = U  (V  W) := by cc,
refine eq.drec_on Hinter _,
congr,
-- now three goals:
-- ⊢ Fres (U ∩ V ∩ W) U HU1 i = Fres (U ∩ V ∩ W) U HU2 i
-- ⊢ Fres (U ∩ V ∩ W) V HV1 j = Fres (U ∩ V ∩ W) V HV2 j
-- ⊢ Fres (U ∩ V ∩ W) W HW1 k = Fres (U ∩ V ∩ W) W HW2 k
sorry,sorry,sorry
end

Chris Hughes (May 20 2018 at 19:20):

but it does.

Chris Hughes (May 20 2018 at 19:21):

set_option trace.app_builder true

That was because something didn't work and the error message suggested I do that.

Kevin Buzzard (May 20 2018 at 19:21):

yeah that was a bit scary with the =

Kevin Buzzard (May 20 2018 at 19:21):

but if X = Y then F X = F Y

Kevin Buzzard (May 20 2018 at 19:23):

Thanks Chris

Kevin Buzzard (May 20 2018 at 19:23):

Indeed your proof works

Kevin Buzzard (May 20 2018 at 19:24):

I am currently mulling over having to translate it into the real life situation

Chris Hughes (May 20 2018 at 19:33):

example (F : set α  Type) [ Z : set α, group (F Z)]
(Fres :  X Y : set α, X  Y  F Y  F X)
(i : F U) (j : F V) (k : F W) :
Fres (U  V  W) U HU1 i * Fres (U  V  W) V HV1 j * Fres (U  V  W) W HW1 k
== Fres (U  (V  W)) U HU2 i * Fres (U  (V  W)) V HV2 j * Fres (U  (V  W)) W HW2 k :=
have Hinter : U  V  W = U  (V  W) := by cc,
@eq.drec_on _ (U  V  W)
(λ s h, Fres (U  V  W) U HU1 i * Fres (U  V  W) V HV1 j * Fres (U  V  W) W HW1 k
== Fres s U (h  HU1) i * Fres s V (h  HV1) j * Fres s W (h  HW1) k) _ Hinter (heq.refl _)

Chris Hughes (May 20 2018 at 19:35):

Probably the best solution is to get subst to work properly. Might be a good after exams project.

Kevin Buzzard (May 20 2018 at 20:37):

Thanks a lot for this Chris! I'll see if this method works in my actual file

Mario Carneiro (May 20 2018 at 22:13):

This works, but I'm not very happy with the result

theorem proof_irrel_heq {p q : Prop} (e : p = q) (hp : p) (hq : q) : hp == hq :=
by subst q; congr

example (F : set α → Type) [∀ Z : set α, group (F Z)]
(Fres : ∀ X Y : set α, X ⊆ Y → F Y → F X)
(i : F U) (j : F V) (k : F W) :
Fres (U ∩ V ∩ W) U HU1 i * Fres (U ∩ V ∩ W) V HV1 j * Fres (U ∩ V ∩ W) W HW1 k
== Fres (U ∩ (V ∩ W)) U HU2 i * Fres (U ∩ (V ∩ W)) V HV2 j * Fres (U ∩ (V ∩ W)) W HW2 k
:=
by have := set.inter_assoc U V W;
   congr; try{assumption};
   { apply proof_irrel_heq, congr, assumption }

Mario Carneiro (May 20 2018 at 22:17):

Didn't I tell you partial functions give you headaches?

Mario Carneiro (May 20 2018 at 22:25):

Why do you have a heq goal in the first place?

Kenny Lau (May 20 2018 at 22:34):

because of bad interface

Mario Carneiro (May 20 2018 at 22:37):

oh, there's a bug in congr

Mario Carneiro (May 20 2018 at 22:40):

meta def congr' : parse small_nat? → tactic unit
| none         := focus1 (assumption <|> (congr_core >>
  all_goals (reflexivity <|> try (congr' none))))
| (some 0)     := failed
| (some (n+1)) := focus1 (assumption <|> (congr_core >>
  all_goals (reflexivity <|> try (congr' (some n)))))

now the following proof works:

by have := set.inter_assoc U V W;
   congr'; apply proof_irrel_heq; congr'

Kenny Lau (May 20 2018 at 22:41):

say what

Mario Carneiro (May 20 2018 at 22:43):

The congr tactic itself should read:

meta def congr : tactic unit :=
do focus1 (assumption <|> (congr_core >> all_goals (reflexivity <|> try congr)))

instead of

meta def congr : tactic unit :=
do focus1 (try assumption >> congr_core >> all_goals (try reflexivity >> try congr))

Mario Carneiro (May 20 2018 at 22:43):

but I don't know if we are still doing bugfixes in 3.4.1

Mario Carneiro (May 20 2018 at 22:43):

so I made my own congr instead

Mario Carneiro (May 20 2018 at 22:45):

Not sure why those proof irrel goals appear though, they should also be taken care of by congr

Kevin Buzzard (May 21 2018 at 07:08):

Why do you have a heq goal in the first place?

I thought of a way around it, in this case.

Kevin Buzzard (May 21 2018 at 07:09):

The reason was that I wanted to prove two structures were equal, but one depended on (U cap V cap W) and one on (U cap (V cap W)), because of the way the structures were made (I was trying to prove addition on a quotient type was associative).

Kevin Buzzard (May 21 2018 at 07:10):

congr would go insane when presented with the problem (the first time I tried it, it turned my goal into 176 goals, no typo)

Kevin Buzzard (May 21 2018 at 07:10):

Kenny suggested a mk_inj solution and that led to the heqs

Kevin Buzzard (May 21 2018 at 07:10):

I remember Chris moaning about heqs before

Kevin Buzzard (May 21 2018 at 07:11):

But last night, 10 minutes after I switched my laptop off and started doing the dishes

Kevin Buzzard (May 21 2018 at 07:11):

I realised I could probably work around it on this occasion, by doing something a mathematican would never understand

Kevin Buzzard (May 21 2018 at 07:11):

I should restrict my section on U cap (V cap W) to a section on U cap V cap W :-)

Kevin Buzzard (May 21 2018 at 07:12):

This only changes it up to equivalence, which is OK for me

Kevin Buzzard (May 21 2018 at 07:13):

[terminology: a sheaf is, amongst other things, a map F : (open sets in a top space) -> (rings) together with restriction maps F(U) -> F(V) whenever V is a subset of U]

Kevin Buzzard (May 21 2018 at 07:14):

The concept of restricting to a subset which is non-definitionally-equal to the set you started with is alien to mathematics but it's exactly the crazy idea which will get me out of this hell

Kevin Buzzard (May 21 2018 at 07:14):

@Mario Carneiro Is Chris right when he suggests that subst could do with some work? His solution seemed to be "subst hst, where h : s = t, and then apply when s and t are more complicated"

Kevin Buzzard (May 21 2018 at 07:15):

as opposed to "subst [the thing we actually want to subst]"

Kevin Buzzard (May 21 2018 at 07:15):

I could imagine that Chris might want to learn something about tactics over the summer. He has two months of being paid to work for me and can do anything

Kevin Buzzard (May 21 2018 at 07:15):

as long as his boss OK's it

Mario Carneiro (May 21 2018 at 07:17):

I was thinking of suggesting that myself. I assume you have some composition axioms, so it might be easiest to work with the restriction from (U/\V)/\W to U/\V/\W

Mario Carneiro (May 21 2018 at 07:17):

It's not as crazy as it sounds; it's basically using (part of) the fact that (U/\V)/\W and U/\V/\W are "isomorphic but not equal" in the DTT sense

Mario Carneiro (May 21 2018 at 07:18):

it helps to think like in category theory here

Mario Carneiro (May 21 2018 at 07:18):

subst is a very basic tactic. It does one thing, and does it well

Mario Carneiro (May 21 2018 at 07:21):

you give it a hypothesis of the form term = x or x = term, and it will eliminate x in favor of term everywhere. This is rather restrictive, but the upside is that it never gets tripped up in dependencies like rw and simp can, because it is implemented purely using eq.drec and the variable restriction ensures that the motive is always type correct

Kevin Buzzard (May 21 2018 at 07:21):

Oh -- x = t means x = term? ;-)

Mario Carneiro (May 21 2018 at 07:22):

(you can also say subst x instead of subst h when you have h : x = term in the context)

Kevin Buzzard (May 21 2018 at 07:22):

isomorphic but not equal is something I know well in the context where the underlying sets are different, but I am only just coming to terms with generalising the idea to situations where the DTTist thinks they're isomorphic and the ZFCist is blinded by this because they think they're equal :-)

Kevin Buzzard (May 21 2018 at 07:23):

Unrelated -- I see you wrote (U cap V) cap W v U cap V cap W

Kevin Buzzard (May 21 2018 at 07:23):

I claim that you mean U cap (V cap W) vs U cap V cap W

Kevin Buzzard (May 21 2018 at 07:23):

and actually this is minorly annoying

Kevin Buzzard (May 21 2018 at 07:23):

because my proofs that x is in U cap V cap W

Kevin Buzzard (May 21 2018 at 07:23):

all look like <<HU,HV>,HW>

Mario Carneiro (May 21 2018 at 07:24):

ah, cap is left assoc?

Kevin Buzzard (May 21 2018 at 07:24):

Is this an oversight

Kevin Buzzard (May 21 2018 at 07:24):

I assume it is

Kevin Buzzard (May 21 2018 at 07:24):

and I already noticed that this was annoying

Kevin Buzzard (May 21 2018 at 07:24):

but I wasn't confident enough to know whether there are other reasons for this

Mario Carneiro (May 21 2018 at 07:24):

I don't have any strong opinions on whether union and intersection are left or right assoc

Kevin Buzzard (May 21 2018 at 07:24):

all I knew is that my proofs were two characters longer than I wanted them to be

Kevin Buzzard (May 21 2018 at 07:25):

you would do if you had to keep writing <<HU,HV>,HW>

Kevin Buzzard (May 21 2018 at 07:25):

heh

Kevin Buzzard (May 21 2018 at 07:25):

maybe I should restrict to U cap (V cap W)

Mario Carneiro (May 21 2018 at 07:25):

also lost two chars there

Kevin Buzzard (May 21 2018 at 07:25):

yeah but I only have to do that once

Kevin Buzzard (May 21 2018 at 07:26):

Something else I noticed

Kevin Buzzard (May 21 2018 at 07:26):

was that existsi is kind of dumb

Mario Carneiro (May 21 2018 at 07:26):

I never use it tbh

Kevin Buzzard (May 21 2018 at 07:26):

existsi (<<HU,HV>,HW>)

Mario Carneiro (May 21 2018 at 07:26):

lol no

Kevin Buzzard (May 21 2018 at 07:26):

"That doesn't make sense"

Kevin Buzzard (May 21 2018 at 07:26):

"You have to tell me the type"

Kevin Buzzard (May 21 2018 at 07:26):

"because I don't know the type"

Kevin Buzzard (May 21 2018 at 07:27):

"even though the goal is "there exists a proof that x is in U cap V cap W"

Kevin Buzzard (May 21 2018 at 07:27):

"

Mario Carneiro (May 21 2018 at 07:27):

just use refine instead

Kevin Buzzard (May 21 2018 at 07:27):

What are your views on "existsi _,tactic.swap"

Kevin Buzzard (May 21 2018 at 07:27):

I think you once told me to avoid it

Kevin Buzzard (May 21 2018 at 07:27):

but it does exactly what I want sometimes

Kevin Buzzard (May 21 2018 at 07:28):

"let's just remove the bloody exists symbol and make it a goal"

Mario Carneiro (May 21 2018 at 07:28):

For exploratory tactic writing it's fine I guess

Kevin Buzzard (May 21 2018 at 07:28):

what about definitive scheme writing?

Kevin Buzzard (May 21 2018 at 07:29):

:-)

Kevin Buzzard (May 21 2018 at 07:29):

I guess it's all exploratory as far as I am concerned

Kevin Buzzard (May 21 2018 at 07:29):

OK back to work

Kevin Buzzard (May 21 2018 at 07:29):

Thanks for the comments as ever

Kevin Buzzard (May 21 2018 at 07:38):

rofl

Kevin Buzzard (May 21 2018 at 07:38):

I proved associativity

Kevin Buzzard (May 21 2018 at 07:38):

end of proof looks like this

Kevin Buzzard (May 21 2018 at 07:38):

  existsi (Ua  Ub  Uc), -- brainwave
  existsi (⟨⟨Hxa,Hxb,Hxc : x  Ua  Ub  Uc),
  existsi (Hstandard _ _ (Hstandard _ _ BUa BUb) BUc),
  existsi (set.subset.refl (Ua  Ub  Uc)),
  existsi ((set.inter_assoc Ua Ub Uc  set.subset.refl _) : Ua  Ub  Uc  Ua  (Ub  Uc)),
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,
  rw presheaf_of_types_on_basis.Hcomp',
  rw presheaf_of_types_on_basis.Hcomp',
  rw add_assoc,

Kevin Buzzard (May 21 2018 at 07:38):

restrict to isomorphic set

Kevin Buzzard (May 21 2018 at 07:39):

prove some trivialities

Kevin Buzzard (May 21 2018 at 07:39):

a bit of rewriting

Kevin Buzzard (May 21 2018 at 07:39):

and apply associativity

Kevin Buzzard (May 21 2018 at 07:39):

not sure that proof is mathlib-ready

Mario Carneiro (May 21 2018 at 07:42):

have you tried using simp instead of rw?

Kevin Buzzard (May 21 2018 at 07:43):

simp insists on rewriting a+b+c as c+a+b

Kevin Buzzard (May 21 2018 at 07:43):

on exactly one side

Kevin Buzzard (May 21 2018 at 07:43):

so I never got it to do anything useful

Kevin Buzzard (May 21 2018 at 07:44):

anyway, this is a breakthrough because if I can prove add_assoc I can prove all the ring axioms

Kevin Buzzard (May 21 2018 at 07:46):

simp [add_assoc,more stuff] doesn't even do it when we're on the last line

Kevin Buzzard (May 21 2018 at 07:46):

My goal is too messy for simp

Kevin Buzzard (May 21 2018 at 07:46):

I need comp

Kevin Buzzard (May 21 2018 at 07:47):

lol

Kevin Buzzard (May 21 2018 at 07:47):

simp [add_assoc,add_comm,(presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add,presheaf_of_types_on_basis.Hcomp'] turns a goal which is closed by rw add_assoc to a goal which is closed by rw add_comm

Kevin Buzzard (May 21 2018 at 07:47):

thanks simp

Kevin Buzzard (May 21 2018 at 07:49):

goal is (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sa + (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sb + (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sc = (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sa + ((FPRB.to_presheaf_of_types_on_basis).res _ _ _ sb + (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sc)

Kevin Buzzard (May 21 2018 at 07:49):

simp [add_assoc,add_comm],

Kevin Buzzard (May 21 2018 at 07:50):

goal becomes (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sc + (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sb = (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sb + (FPRB.to_presheaf_of_types_on_basis).res _ _ _ sc

Kevin Buzzard (May 21 2018 at 07:50):

Unless my eyes are deceiving me simp just turned add_assoc into add_comm

Kevin Buzzard (May 21 2018 at 07:51):

terms are in a comm_ring

Kevin Buzzard (May 21 2018 at 07:53):

obviously-minimised version doesn't exhibit the problem

Kevin Buzzard (May 21 2018 at 07:54):

sa,sb,sc all in different rings, the FPRB...res is mapping them down all into the same ring

Kevin Buzzard (May 21 2018 at 07:55):

example (R : Type) [comm_ring R] (α β γ : Type) (a : α) (b : β) (c : γ)
(f : α  R) (g : β  R) (h : γ  R) : f a + g b + h c = f a + (g b + h c) := begin
simp [add_assoc,add_comm],
end

Kevin Buzzard (May 21 2018 at 07:55):

works fine

Kevin Buzzard (May 21 2018 at 07:56):

so it's something in my _s

Kevin Buzzard (May 21 2018 at 07:58):

but at the end of the day I have a goal which can be cleared (without errors) either with rw add_assoc or simp [add_assoc,add_comm],rw add_comm

Kevin Buzzard (May 21 2018 at 08:02):

hey stupid comm_ring, why are you asking me to prove a+0=a and 0+a=a and a+b=b+a?

Kevin Buzzard (May 21 2018 at 08:02):

well, I know why

Kevin Buzzard (May 21 2018 at 08:02):

but wouldn't it be nice if you didn't

Kevin Buzzard (May 21 2018 at 08:02):

I need a better comm_ring constructor I guess

Chris Hughes (May 21 2018 at 08:55):

simp only might help

Mario Carneiro (May 21 2018 at 09:10):

you can always add -add_comm to your simp set to fix superfluous rewriting

Kevin Buzzard (May 21 2018 at 09:13):

existsi (Ua ∩ Ua)

Kevin Buzzard (May 21 2018 at 09:13):

I can't believe I just wrote that

Kevin Buzzard (May 21 2018 at 09:13):

proving add_neg

Kevin Buzzard (May 21 2018 at 09:14):

just restrict everything down to there and it will be fine

Patrick Massot (May 21 2018 at 09:17):

Just to be sure: Kevin, do you know you can write repeat { rw (presheaf_of_rings_on_basis.res_is_ring_morphism FPRB _ _ _).map_add, },?

Kevin Buzzard (May 21 2018 at 09:22):

yeah, but I like watching the goal slowly decay

Kevin Buzzard (May 21 2018 at 09:22):

I just had to write rw is_ring_hom.map_neg (FPRB.res _ _ _);try {apply_instance},

Kevin Buzzard (May 21 2018 at 09:22):

that surprised me.

Patrick Massot (May 21 2018 at 09:22):

I'm still puzzled each time I need to write apply_instance.

Patrick Massot (May 21 2018 at 09:23):

I don't understand why Lean doesn't do that for me

Patrick Massot (May 21 2018 at 09:23):

sometimes

Kevin Buzzard (May 21 2018 at 09:23):

I applied map_neg (the statement that a morphism of rings satisfies f(-x)=-f(x))

Kevin Buzzard (May 21 2018 at 09:23):

and all of a sudden it asked me if f was a ring hom and was the source a ring?

Kevin Buzzard (May 21 2018 at 09:23):

and apply_instance said yes

Patrick Massot (May 21 2018 at 09:25):

Exactly the kind of situation where I'm puzzled

Patrick Massot (May 21 2018 at 09:25):

Why isn't this automatic?

Kevin Buzzard (May 21 2018 at 09:26):

I dunno

Kevin Buzzard (May 21 2018 at 09:26):

I have two choices today

Patrick Massot (May 21 2018 at 09:26):

Is it a bug in the apply tactic?

Kevin Buzzard (May 21 2018 at 09:26):

I could spend a pleasant day verifying the axioms of a ring

Patrick Massot (May 21 2018 at 09:26):

(Or simp, refine,...)

Kevin Buzzard (May 21 2018 at 09:26):

or I could mark 100 proofs of various trivial lemmas about sup of a set of reals

Kevin Buzzard (May 21 2018 at 09:26):

and I am currently at home doing the former

Kevin Buzzard (May 21 2018 at 09:27):

and I'm already on add_comm

Kevin Buzzard (May 21 2018 at 09:27):

but I really should be doing the latter...

Patrick Massot (May 21 2018 at 09:27):

Too bad you can't quite hire Kenny or Chris to mark these exams for you...

Kevin Buzzard (May 21 2018 at 09:27):

I knew that once I managed add_assoc the rest would be trivial

Kevin Buzzard (May 21 2018 at 09:27):

but it takes time

Kevin Buzzard (May 21 2018 at 09:27):

rofl

Kevin Buzzard (May 21 2018 at 09:27):

I'm not sure if the university would be keen on students marking their own scripts

Patrick Massot (May 21 2018 at 09:28):

yep, universities tend to have all kind of stupid administrative rules like that

Kevin Buzzard (May 21 2018 at 09:28):

I am much keener on Lean marking their scripts

Kevin Buzzard (May 21 2018 at 09:28):

When they're done I might well write a blog post about how Lean does the question

Patrick Massot (May 21 2018 at 09:28):

Do you know which ones are from Kenny and Chris or are there anonymous?

Kevin Buzzard (May 21 2018 at 09:28):

yes and yes

Patrick Massot (May 21 2018 at 09:29):

Do you mean two out of 100 gave answer in Lean written on paper, and you guessed?

Kevin Buzzard (May 21 2018 at 09:29):

I recognise their handwriting and I know enough about where they were sitting in the room to be able to work it out

Kevin Buzzard (May 21 2018 at 09:30):

In fact I missed Chris' script for Q1

Kevin Buzzard (May 21 2018 at 09:30):

so I don't really know

Kevin Buzzard (May 21 2018 at 09:30):

but I did notice Kenny's, a combination of the handwriting, the way he presented the arguments, and the fact that I did unfortunately know that his script would be "around this point in the pile"

Kevin Buzzard (May 21 2018 at 09:31):

I could be wrong though

Kevin Buzzard (May 21 2018 at 09:31):

I have no formal proof that it was Kenny's

Kevin Buzzard (May 21 2018 at 09:31):

In fact it was the fact that I recognised Kenny's handwriting that I realised I must have missed Chris' script

Kenny Lau (May 21 2018 at 09:32):

where did you get my handwriting sample from?

Kevin Buzzard (May 21 2018 at 09:32):

You have sent me lots of handwriting in private zulip chats

Kevin Buzzard (May 21 2018 at 09:32):

and I am sort of a bit weird about handwriting for some reason

Kevin Buzzard (May 21 2018 at 09:32):

I am quite good at recognising it

Kenny Lau (May 21 2018 at 09:33):

very interesting

Kevin Buzzard (May 21 2018 at 09:33):

I guess I should be clear: I have no way of verifying that the script I strongly suspected was Kenny's, was Kenny's

Kevin Buzzard (May 21 2018 at 09:34):

which of course is a good thing

Kenny Lau (May 21 2018 at 09:34):

how many questions have you marked?

Kevin Buzzard (May 21 2018 at 09:34):

1.3

Kenny Lau (May 21 2018 at 09:34):

did you mark the sup(A+B)=sup(A)+sup(B)?

Kevin Buzzard (May 21 2018 at 09:35):

doing that one today

Kevin Buzzard (May 21 2018 at 09:35):

or more of it

Kenny Lau (May 21 2018 at 09:35):

I see

Kevin Buzzard (May 21 2018 at 09:35):

Hope to get another 0.3 of it done

Kevin Buzzard (May 21 2018 at 09:35):

indeed I am just off now

Mario Carneiro (May 21 2018 at 09:36):

Sometimes you get those apply_instance goals when you use apply with underscores, due to some strange elaboration order stuff. Essentially those goals are unknown at the time when instance resolution normally happens

Mario Carneiro (May 21 2018 at 09:36):

using refine instead may help

Patrick Massot (May 21 2018 at 10:09):

Do you get a student teacher collusion law suit if some other student realize Kenny answered "This function is continuous because it goes from R to R" as a signal to trigger special marking?

Andrew Ashworth (May 21 2018 at 10:19):

I always appreciated automated marking, which you can do for programming assignments (and Lean, too!). Instant feedback if the grader is set up correctly, less need to attend office hours in order to discover that "one special trick professors want you to know about"

Patrick Massot (May 21 2018 at 10:19):

What do you use for automated marking?

Andrew Ashworth (May 21 2018 at 10:21):

Our CS department cobbled together a web server and a bunch of Python scripts

Patrick Massot (May 21 2018 at 10:21):

Is there anything public?

Andrew Ashworth (May 21 2018 at 10:23):

hmm, doubt it. shell scripts aren't the sort of thing that people would even think to release

Andrew Ashworth (May 21 2018 at 10:30):

they all tend to be custom solutions based on whatever your institution's favorite content management system is... for example, this one links with Canvas: https://github.com/arthuraa/sf-grader

Kevin Buzzard (May 25 2018 at 17:40):

Do you know which ones are from Kenny and Chris or are there anonymous?

OK so I asked some question about sups. I got about 80 correct solutions, of which 79 were a proof by contradiction, and one was constructive. And in Kenny's handwriting. And using the kind of pen he uses. But really -- it is anonymous!

Andrew Ashworth (May 25 2018 at 17:42):

You can tell the difference between pens? Does he have a fountain pen?

Moses Schönfinkel (May 25 2018 at 17:46):

Perhaps Kenny uses one of those rainbow pencils.


Last updated: Dec 20 2023 at 11:08 UTC