--
You received this message because you are subscribed to the Google Groups "Ghilbert" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ghilbert+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Yes, I have started on a new version.
It will be quite different in some important ways. Instead of s-expressions, I will use a precedence parser, and symbols will be Unicode, so reading source files will look pretty close to typeset math.
For proofs, instead of RPN, there will be a more pleasant syntax that allows naming (and sharing) of intermediate proof steps, and hopefully allows more choices in expressing the structure of a proof.
Including "mandatory hypothesis" terms in a proof will go away, it will all be filled in with unification.
I'm still convinced that the semantics of import/export are right, but the syntax is super confusing. I'll try to make it look like generics/typeclasses.
I'm backing away from doing anything online, and will center development on github (your github account is your id, submissions are done by PR, etc). Rendering to static html will be done by webhook. This will be fast because Rust. If the thing flies we can look at online/interactive later (I still consider it interesting).
On Apr 20, 2017 1:51 AM, "Raph Levien" <raph....@gmail.com> wrote:Yes, I have started on a new version.Ah, wonderful! I look forward to watching your progress.It will be quite different in some important ways. Instead of s-expressions, I will use a precedence parser, and symbols will be Unicode, so reading source files will look pretty close to typeset math.Hm, that sounds... ambitious! I know you didn't ask for input, but hope you won't mind me sharing my reactions (as someone who has written a few ghilbert proofs) .
1. It seems to me that typeset math requires some pretty sophisticated visual details to render any kind of complicated expression in a readable way. I'm thinking about inter-line spacing (for super/subscript), varying parenthesis size (to track nesting levels), careful kerning and font-face choices (especially if multi-letter variables are in use), etc.. Even with infix terms and the full suite of unicode characters, I am skeptical that a fixed-width, newline-delimited source file will ever be readable "as math" to the unassisted human eye.
2. While sexps do take some getting used to, they are really nice for searchability. I've always said we need a proper theorem search engine (with some kind of sophisticated query input, hopefully in HTML/JS), but until we get one, using `isearch-forward` in emacs (or `grep` on the commandline) actually works pretty darn well for navigating a corpus in sexp notation. I'm not sure how well it will work with a precedence parser. (It seems you'd have to know, ahead of time, much more about the leaves of your desired expression.)
3. And finally, maybe I'm still stuck in the last century, but I still find it really unpleasant to edit source files with unicode characters. There's something very satisfyingly immediate when every character in the file has a glyph on my keyboard and my fingers know exactly how to type it directly (without an extra level of abstraction for a fancy input-method).
For proofs, instead of RPN, there will be a more pleasant syntax that allows naming (and sharing) of intermediate proof steps, and hopefully allows more choices in expressing the structure of a proof.Sounds cool! I remember having a lot of trouble with the RPN notation when I first started. But now it's wormed its way so deeply into my brain that I can't imagine the alternative. I look forward to seeing more!
Including "mandatory hypothesis" terms in a proof will go away, it will all be filled in with unification.This fills me with the greatest possible joy.I'm still convinced that the semantics of import/export are right, but the syntax is super confusing. I'll try to make it look like generics/typeclasses.Agreed on both points. I'm not sure I know quite what you mean about generics, but I think I get the drift, and I like it.
One thing I wondered this morning, in connection with that article I linked about combinators: what do you think about supporting a richer type system for `kind` statements? E.g. allowing a (K) term to have kind (A -> (B -> A)), where A and B can be any kinds. We already have a unifier for condensed detachment, so it shouldn't be too much extra work to use it for type checking as well. This might make "kindbind" unnecessary. (But it may well be more complexity than it's worth, and it would certainly widen the gulf from Metamath, which would be a shame.)
I'm backing away from doing anything online, and will center development on github (your github account is your id, submissions are done by PR, etc). Rendering to static html will be done by webhook. This will be fast because Rust. If the thing flies we can look at online/interactive later (I still consider it interesting).I think that makes some good sense. (In case anyone remembers my little attempt at a gamified web interface: I ended up rewriting it from scratch in a purely-static way (plus a Firebase database for interactivity) and hosting on github. It's still very much a prototype though: https://abliss.github.io/tacro )
Cheers,--Adam
One thing I wondered this morning, in connection with that article I linked about combinators: what do you think about supporting a richer type system for `kind` statements? E.g. allowing a (K) term to have kind (A -> (B -> A)), where A and B can be any kinds. We already have a unifier for condensed detachment, so it shouldn't be too much extra work to use it for type checking as well. This might make "kindbind" unnecessary. (But it may well be more complexity than it's worth, and it would certainly widen the gulf from Metamath, which would be a shame.)I'm still very much wrestling with this. I think what you're describing is actually more types than kinds. Obviously in the lambda-Pi calculus you can have types as much as you like (in fact, it's hard to swing a cat in lambda-Pi without being completely inundated with types).In my pre-lambda-Pi thinking, I was you would do this with kinds, and with import/export. In fact, I believe you can do something like this with the existing Ghilbert implementation, but it's painful to actually use. You define an interface for, say, predicate calculus, with a kind for the range of quantifiers. Then you import three instances of that interface, one for A, one for B, and one for A_arrow_B. Lastly, you import an interface that defines this arrow operator in terms of the kinds you've imported, defining new terms as expected for abstraction and application.Of course, in the existing Ghilbert, you'd use string prefixes for namespacing, as you'd be dealing with multiple instances of the same interface, and notationally the whole thing is cumbersome to an extreme.
--