|- ( ∨1c e. CC -> ( ∨3c e. NN0 -> ( ( 1 - ∨1c ) x. sum_ ∨2s e. ( 0 ... ∨3c ) ( ∨1c ^ ∨2s ) ) = ( 1 + -u ( ∨1c ^ ( ∨3c + 1 ) ) ) ) )/** proving that ( ∨1c e. CC -> ( ∨3c e. NN0 -> ( ( 1 - ∨1c ) x. sum_ ∨2s e. ( 0 .. ∨3c ) ( ∨1c ^ ∨2s ) ) = ( 1 + -u ( ∨1c ^ ( ∨3c + 1 ) ) ) ) ) */
val assertion = "( ( 1 - ∨1c ) x. sum_ ∨2s e. ( 0 ... ∨3c ) ( ∨1c ^ ∨2s ) )".toSingle("∨1c e. CC", "∨3c e. NN0")
val result = "( 1 + -u ( ∨1c ^ ( ∨3c + 1 ) ) )".toStatement()
val step = "|- ( ∨1c e. CC -> ( ∨3c e. NN0 -> ( ( 1 - ∨1c ) x. sum_ ∨2s e. ( 0 ... ∨3c ) ( ∨1c ^ ∨2s ) ) = ( 1 + -u ( ∨1c ^ ( ∨3c + 1 ) ) ) ) )".toStatement()
val i = "∨2s".toStatement()
val j = dummy(MType.S, assertion.origin, *assertion.context.toTypedArray())
val proof = assertion
.s(AxSum) /*.s(A_times_Sum)*/ // sum_ ∨2s e. ( 0 .. ∨3c ) ( ( 1 - ∨1c ) x. ( ∨1c ^ ∨2s ) )
.c(rotX) // sum_ ∨2s e. ( 0 .. ∨3c ) ( ( ∨1c ^ ∨2s ) x. ( 1 - ∨1c ) )
.c(Ax_BsubC) // sum_ ∨2s e. ( 0 .. ∨3c ) ( ( ( ∨1c ^ ∨2s ) x. 1 ) - ( ( ∨1c ^ ∨2s ) x. ∨1c ) )
.eq(P.c.a.th(Ax1), P.c.c.th(Aexp_Bp1)) // sum_ ∨2s e. ( 0 .. ∨3c ) ( ( ∨1c ^ ∨2s ) - ( ∨1c ^ ( ∨2s + 1 ) ) )
.s(Sum_AsubB) // ( sum_ ∨2s e. ( 0 .. ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨2s e. ( 0 .. ∨3c ) ( ∨1c ^ ( ∨2s + 1 ) ) )
.c(Sum_CDI) { arrayOf(j, statement1, "( ∨1c ^ ( ( $j - 1 ) + 1 ) )".toStatement()) } // ( sum_ ∨2s e. ( 0 .. ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨5s e. ( ( 0 + 1 ) .. ( ∨3c + 1 ) ) ( ∨1c ^ ( ( ∨5s - 1 ) + 1 ) ) )
.eq(P.c.b.a.mut(Engine::reduceAddition)) // ( sum_ ∨2s e. ( 0 ... ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨5s e. ( 1 ... ( ∨3c + 1 ) ) ( ∨1c ^ ( ( ∨5s - 1 ) + 1 )
.eq(P.c.c.c.th(rotSubP)) // ( sum_ ∨2s e. ( 0 ... ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨5s e. ( 1 ... ( ∨3c + 1 ) ) ( ∨1c ^ ( ∨5s - ( 1 - 1 ) ) )
.eq(P.c.c.mut(Engine::reduce)) // ( sum_ ∨2s e. ( 0 ... ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨5s e. ( 1 ... ( ∨3c + 1 ) ) ( ∨1c ^ ∨5s ) )
.eq(P.a.th(ApSumA) { arrayOf("( ∨1c ^ 0 )".toStatement()) }, P.c.th(SumA_pA) { arrayOf("( ∨1c ^ ( ∨3c + 1 ) )".toStatement()) }) // ( ( ( ∨1c ^ 0 ) + sum_ ∨2s e. ( ( 0 + 1 ) ... ∨3c ) ( ∨1c ^ ∨2s ) ) - ( sum_ ∨5s e. ( 1 ... ( ( ∨3c + 1 ) - 1 ) ) ( ∨1c ^ ∨5s ) + ( ∨1c ^ ( ∨3c + 1 ) ) ) )
.eq(P.a.a.mut(Engine::reduce), P.a.c.b.mut(Engine::reduce), P.c.a.b.c.th(rotPSub)) // ( ( 1 + sum_ ∨2s e. ( 1 ... ∨3c ) ( ∨1c ^ ∨2s ) ) - ( sum_ ∨5s e. ( 1 ... ( ∨3c + ( 1 - 1 ) ) ) ( ∨1c ^ ∨5s ) + ( ∨1c ^ ( ∨3c + 1 ) ) ) )
.eq(P.c.a.b.c.mut(Engine::reduce)) // ( 1 + sum_ ∨2s e. ( 1 ... ∨3c ) ( ∨1c ^ ∨2s ) ) - ( sum_ ∨5s e. ( 1 ... ∨3c ) ( ∨1c ^ ∨5s ) + ( ∨1c ^ ( ∨3c + 1 ) ) ) )
.s(rotPSub) // ( 1 + ( sum_ ∨2s e. ( 1 .. ∨3c ) ( ∨1c ^ ∨2s ) - ( sum_ ∨5s e. ( 1 .. ∨3c ) ( ∨1c ^ ∨5s ) ) + ( ∨1c ^ ( ∨3c + 1 ) ) )
.c(rotSubSub) // ( 1 + ( ( sum_ ∨2s e. ( 1 .. ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨5s e. ( 1 .. ∨3c ) ( ∨1c ^ ∨5s ) ) - ( ∨1c ^ ( ∨3c + 1 ) ) )
.eq(P.c.a.c.th(Sum_CDV) { arrayOf(i, "( ∨1c ^ $i )".toStatement()) }) // ( 1 + ( ( sum_ ∨2s e. ( 1 .. ∨3c ) ( ∨1c ^ ∨2s ) - sum_ ∨2s e. ( 1 .. ∨3c ) ( ∨1c ^ ∨2s ) ) - ( ∨1c ^ ( ∨3c + 1 ) ) )
.eq(P.c.mut(Engine::reduce)) // ( 1 + -u ( ∨1c ^ ( ∨3c + 1 ) ) )
/** done */
context("Exo 2.7") {
it("a") {
val s = "sum_ ∨2s e. ( 1 ... ( ∨1c - 1 ) ) ( ( 5 x. ( 3 ^ -u ∨2s ) ) - ( 4 x. ( 2 ^ ( ( 2 x. ∨2s ) - 1 ) ) ) )".toSingle("∨1c e. NN")
}
it("b") {
val s = "sum_ ∨2s e. ( 0 ... ∨1c ) ( ( 1 / 4 ) ^ ( 2 x. ∨2s ) ) )".toSingle("∨1c e. NN0")
}
it("c") {
val s = "sum_ ∨2s e. ( 1 ... ∨1c ) ( ( ( ( ( ∨1c ^ 2 ) x. ∨2s ) + ( ∨1c x. ( ∨2s ^ 2 ) ) ) - ( 3 x. ( ∨2s ^ 3 ) ) ) / ( ∨1c ^ 4 ) )".toSingle("∨1c e. NN0")
}
it("d") {
val s = "sum_ ∨2s e. ( 0 ... ∨1c ) ( ( ( ( ∨2s x. ( ∨2s - 1 ) ) x. ( 3 ^ ∨2s ) ) - ( 5 ^ ( ∨2s - 1 ) ) ) / ( 3 ^ ∨2s ) )".toSingle("∨1c e. NN0")
}
it("e") {
val s = "sum_ ∨2s e. ( 0 ... ( ( 2 x. ∨1c ) - 1 ) ) ( 5 / ( 6 ^ ( ∨2s - 1 ) ) )".toSingle("∨1c e. NN0")
}
}
context("Exo 2.10") {
it("1 (induction)") {
val s = "sum_ ∨2s e. ( 1 ... ∨1c ) ( ∨2s x. ( ! ` ∨2s ) ) = ( ( ! ` ( ∨2s + 1 ) ) - 1 )".toSingle("∨1c e. NN")
}
it("2 (telescopic sums)") {
val s = "sum_ ∨2s e. ( 1 ... ∨1c ) ( ∨2s x. ( ! ` ∨2s ) )".toSingle("∨1c e. NN")
}
}
--
You received this message because you are subscribed to the Google Groups "Metamath" group.
To unsubscribe from this group and stop receiving emails from it, send an email to metamath+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/metamath/3c43167b-f7ad-4eff-b90e-a75460fd5862%40googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to meta...@googlegroups.com.
I have 2 targets for the app :
- mathematicians
Real mathematicians don't use proof checkers, I'm afraid. It's too time-consuming.
Il 22/01/20 11:00, OlivierBinda ha scritto:
Obviously, making the action menu resizable and dragable was a big mistake : next time, it'll be anchored at the right side of the window and will resize automatically automatically
Yes, it's quite clear that the action menu is still rather awkward to use. And, to be honest, I don't think it is easy to find the right way to lay it down. It seems to be quite a UX challenge.
Yes, I'll try my best (and take advices)
Also, in the next release, I am planning to filter/order
display in a better way the actions in this menu (because it is
a mess at the moment). It is very hard to do so(it requires
human smarts), but I'll probably be able to do a decent job
(with computer smarts).
Another thing I noticed is that the variable name that you write are different from those that appear in the pretty printed formula. For example, you write "v1c" and "X" appears in the formula. This is quite counterintuitive, I believe.
Yes, you are right about that
Internally, Mephistolus uses names like v2s, v8c, v3w
for setvar, classvar and wffvar
But as It is aimed at the general public, my goal is to allow
people to use the variable names they like
x, k,n or it might be stuff like 平 or ひ , etc...
At the moment, I am able to display
custom variable names.
But I haven't implemented yet, the translation process to
convert a user variable name like x, to the right variable
set/class/wff type
I still have to figure out how to do it. I'll probably try
first to infer if it should be a wff var or not,
go with class var by default and fallback to setvar if it is
necessary.
Hopefully, that will work out nicely (or I'll have to think
further about it :) )
ps : sorry for the double mail, I'll probably get it soon ^^
5) Mm0a) get a file for set.mm0 (set.mm translated to mm0) Mario, I'm looking at you...
b) parse set.mm0
c) extract a list of all mm0 idsd) write a parser for mm0 statementse) make the mephistolus Statement able to be build on mm0 stuff
Very interesting!
It's nice to see that apart from entering the input at the very
beginning, and apart from the substitutions, you only deal with
the graphical display of the equations.
Do you have any idea how the last use of dummy variables (v1c,
v3c), for substitutions, could be eliminated?
I wonder what is the operation "order" towards the top of the
list, which results in "0". Does it mean it cannot be applied?
Could you then simply omit to list it?
Of course an interesting topic to discuss is the choice of
when/where to add parenthesis, we had an extensive discussion
about this when I introduced the
I saw some cases where it seems to be they can obviously be
removed, like in " ( k e. ( { A ... B } ) ) " at 2:10. That's
parenthesis where even set.mm does not have any! ;-)
--
You received this message because you are subscribed to the Google Groups "Metamath" group.
To unsubscribe from this group and stop receiving emails from it, send an email to metamath+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/metamath/af959f49-b997-48f3-9ae8-8705f04da967%40googlegroups.com.
Very interesting!
It's nice to see that apart from entering the input at the very beginning, and apart from the substitutions, you only deal with the graphical display of the equations.
Do you have any idea how the last use of dummy variables (v1c, v3c), for substitutions, could be eliminated?
Yes. There is no reason a computer would need 3 substitutions
when a human only uses 1 + mechanical computation.
That is, when you shift an index in a sum, you should just need to
give the amount of shifting
It should be possible to make Mephistolus accomplish this by
having it analyze the hypotheses of a theorem,
find the ones where a substitution or a computation happens to
define another substitution
and only ask for the values needed to infer other substitutions
automatically
That's my plan
I wonder what is the operation "order" towards the top of the list, which results in "0". Does it mean it cannot be applied?
Could you then simply omit to list it?
I mean if you have |- a = b, most of the time, you don't want to
have |- a = b + 0 or |- a = ( b x. 1 ) next
Of course an interesting topic to discuss is the choice of when/where to add parenthesis, we had an extensive discussion about this when I introduced the
when you introduced the ?
May I have a link to this discussion (this interests me a lot, as
you can guess).
In the mean time, I'll dig into the metamath discussions, Thierry
Arnoux posts to try to find clues about that
I saw some cases where it seems to be they can obviously be removed, like in " ( k e. ( { A ... B } ) ) " at 2:10. That's parenthesis where even set.mm does not have any! ;-)
Yes ^^ :) lol
I have only just started removing useless parenthesis
(like 4 days ago and this is my first try)
I basically walk the tree structure for a metamath statement and,
for each pair of (child, parent),
I decide if the child needs a parenthesis.
There are quite a lot of things that can be done with that.
I mostly look :
- if the child has at least 2 children
- if the child operation priority is less than the parent
operation priority
at the moment, with only partial coverage of the operators I use.
So, there are still parentheses that can be removed (around sums
also)
Thanks for the feedback and the pointer (I'll go start looking for your posts now)
Best regards,
Olivier