Zulip Chat Archive
Stream: new members
Topic: Sizeof for types in Prop
Anton Lorenzen (Mar 22 2020 at 15:17):
I am currently refactoring a type to be in Prop instead of Type and this is breaking the well-foundedness proof of a function since the mytype.sizeof
function doesn't exist anymore. Is there an easy way to fix this? And why is there no sizeof
for types in Prop (that only eliminates into Prop or so..)?
Mario Carneiro (Mar 22 2020 at 15:18):
there is no way to define a sizeof
for Prop valued inductive predicates, unless they are large eliminating
Mario Carneiro (Mar 22 2020 at 15:19):
or if they have some other special property specific to the set up
Mario Carneiro (Mar 22 2020 at 15:21):
do you have an example?
Anton Lorenzen (Mar 22 2020 at 15:23):
From the type checker I sent you. I figured out how to put Judgement into Prop, but now this lemma is breaking:
lemma typing_pi : Π {g x a b t}, Judgement g (Exp.pi x a b) t → ∃ s, Judgement g a (Exp.sort s) | g x a b t (@Judgement.product _ _ _ _ s _ _ r ta _) := ⟨s, ta⟩ | g x a b t (@Judgement.conv _ _ _ _ _ _ _ tr) := typing_pi tr | (Context.cons _ _ _) x a b t (@Judgement.weaken _ _ _ _ s _ h j js) := let ⟨res, j2⟩ := typing_pi j in ⟨res, @Judgement.weaken _ _ _ _ s _ h j2 js⟩ using_well_founded { rel_tac := λ _ _, `[exact ⟨_, measure_wf (λ j, begin rcases j with ⟨g, x, a, b, t, j⟩, exact Judgement.sizeof g (Exp.pi x a b) t j, end)⟩ ] }
Anton Lorenzen (Mar 22 2020 at 15:23):
More specifically the using_well_founded
part
Anton Lorenzen (Mar 22 2020 at 15:26):
I can push the whole code to Github in half an hour or so
Mario Carneiro (Mar 22 2020 at 15:27):
Use tactic mode and induction
to prove it, instead of using the equation compiler
Mario Carneiro (Mar 22 2020 at 15:28):
is that well founded metric different from the usual structural order on Judgment
?
Mario Carneiro (Mar 22 2020 at 15:30):
can't typecheck so I might have the details wrong, but the setup should look something like this:
lemma typing_pi {g x a b t} (h : Judgement g (Exp.pi x a b) t) : ∃ s, Judgement g a (Exp.sort s) := begin generalize e : Exp.pi x a b = y, induction h generalizing x a b e, end
Anton Lorenzen (Mar 22 2020 at 15:30):
What is this usual order?
Mario Carneiro (Mar 22 2020 at 15:31):
Structural recursion
Anton Lorenzen (Mar 22 2020 at 15:32):
is that well founded metric different from the usual structural order on Judgment?
I still don't understand that
Mario Carneiro (Mar 22 2020 at 15:33):
I shouldn't actually call it an order since we're talking about props here, it's an order on the terms at the metalevel
Mario Carneiro (Mar 22 2020 at 15:34):
basically the arguments to a constructor are less than the conclusion, and the structural order is the minimal order satisfying that property
Anton Lorenzen (Mar 22 2020 at 15:35):
The problem with the induction tactic is that it doesn't recognize that not all constructors can give that type and makes me prove the lemma for all of them.
Mario Carneiro (Mar 22 2020 at 15:35):
that's what the generalize
line is for
Mario Carneiro (Mar 22 2020 at 15:36):
You can follow up the induction
line with ; cases e
and it should clear those cases up
Anton Lorenzen (Mar 22 2020 at 15:36):
The second generalize says get_local tactic failed, unknown 'x' local
Anton Lorenzen (Mar 22 2020 at 15:36):
Same with b but not with a or e
Mario Carneiro (Mar 22 2020 at 15:37):
show me your code?
Anton Lorenzen (Mar 22 2020 at 15:37):
Using only generalize a e
followed by cases e
doesnt help
Anton Lorenzen (Mar 22 2020 at 15:37):
lemma typing_pi : Π {g x a b t}, Judgement g (Exp.pi x a b) t → ∃ s, Judgement g a (Exp.sort s) := begin intros g x a b t h, generalize e : Exp.pi x a b = y, induction h generalizing a e, cases e, end
Anton Lorenzen (Mar 22 2020 at 15:37):
Or all of it?
Mario Carneiro (Mar 22 2020 at 15:38):
the generalize
line fails?
Mario Carneiro (Mar 22 2020 at 15:38):
Oh, you have to intro h
after the generalize
Anton Lorenzen (Mar 22 2020 at 15:39):
Better, no get_local error. But still too many cases
lemma typing_pi : Π {g x a b t}, Judgement g (Exp.pi x a b) t → ∃ s, Judgement g a (Exp.sort s) := begin intros g x a b t, generalize e : Exp.pi x a b = y, intro h, induction h generalizing x a b e, cases e, end
Mario Carneiro (Mar 22 2020 at 15:39):
semicolon before cases
Anton Lorenzen (Mar 22 2020 at 15:40):
Oh, that does the trick!
Anton Lorenzen (Mar 22 2020 at 15:40):
Where can I read more about that black magic?
Mario Carneiro (Mar 22 2020 at 15:40):
which part?
Mario Carneiro (Mar 22 2020 at 15:41):
tac1; tac2
does tac1
, and then does tac2
on every subgoal created by tac1
Anton Lorenzen (Mar 22 2020 at 15:41):
Ah okay!
Anton Lorenzen (Mar 22 2020 at 15:42):
Let's see if I can prove it now
Mario Carneiro (Mar 22 2020 at 15:42):
tac1, tac2
by contrast applies tac2
in the context of all the goals created by tac1
, which for most tactics means that it will only do something to the first goal created by tac1
Mario Carneiro (Mar 22 2020 at 15:43):
You can also do tac1; [tac2, tac2, tac2, tac2, tac2]
to apply tac2
on all the goals created by tac1
Anton Lorenzen (Mar 22 2020 at 15:56):
Alright:
lemma typing_pi : Π {g x a b t}, Judgement g (Exp.pi x a b) t → ∃ s, Judgement g a (Exp.sort s) := begin intros g x a b t, generalize e : Exp.pi x a b = y, intro h, induction h generalizing e; cases e, { cases h_ih_a (eq.refl _), apply exists.intro w, apply Judgement.weaken, exact h_noShadowing, exact h, exact h_a_1, }, { exact ⟨h_s1, h_a⟩ }, { from h_ih_a_1 (eq.refl _) }, end
Though I have to say that I found the old version a lot more readable..
Last updated: Dec 20 2023 at 11:08 UTC