Poi: Pragmatic point-free theorem prover assistant in Rust
github.com
github.com
> (len . concat)(a, b)
(len · concat)(a, b)
(len · concat)(a)(b)
(concat[len] · (len · fst, len · snd))(a)(b)
(add · (len · fst, len · snd))(a)(b)
<=> add((len · fst)(a)(b), (len · snd)(a)(b))
> add((len · fst)(a)(b), (len · snd)(a)(b))
add((len · fst)(a)(b), (len · snd)(a)(b))
add((len · fst)(a)(b))((len · snd)(a)(b))
add(len(a))((len · snd)(a)(b))
add(len(a))(len(b))
This raises a few questions:1. How is this supposed to be point-free? a and b are clearly arguments. Wouldn't you replace them with obscure projection functions if you really believed that being point-free was useful?
2. What about this are inputs of the system, and what are the outputs? I'm guessing > marks what the user input, and the other lines are rewrites produced by the system. In that case, why did it stop after a few steps when it was clearly able to continue?
3. Don't you need induction to prove this theorem? Where is the induction step? Where is the base case?
4. Are some of the rewrites based on lemmas already proved and stored in the system? If so, wouldn't it be useful to mark such rewrites?
not x not
o ---------> o o -------> path-space
| | |
and | | or |
V V |
o ---------> o V
not computation
Huh? I don't get it. This is supposed to be DeMorgan's in this weird notation. I know DeMorgan's but I don't get that diagram. I'm reading about path semantics via the links in the github but it seems to me you need to already have a bit of a background in a certain, shall we say, remote, area of either mathematics of computer science, or the mathematics of computer science in order to follow quickly without spending time going down wikipedia rabbit holes.Anyway, sounds like an interesting thing to spend some free time on. Thanks.
Oh, please do ELI5 if anyone can.
What's a "path", though? Why is it not a computation to map 0 to 1 and 1 to 0?
I guess you might say that applying the function (not x not) is somehow a higher-order "computation on other computations", so that step might be a "path" (if that's the meaning, the term is ridiculously badly chosen). But the bottom edge is simply applying the "not" function to some binary data.
Additionally, I honestly share no intuition that the term "path" is meant to convey. At a very big guess it sounds to me like the "path" that a bit takes through a theoretical computing machine of some kind. But I really don't understand the term.
But having looked at the reddit thread it sounds like this is some non-standard usage and this dude is a crank.
https://old.reddit.com/r/rust/comments/bn5eoz/since_some_peo...
Path semantics is still very much a work in progress so it's hard for outsiders to really get into it.
For comparison, it took about four years from Voevodsky formulating the univalence axiom to the publication of the HoTT book.
Also, in the mean time he has worked on other things.
https://github.com/advancedresearch/path_semantics/tree/mast...
If that time were spent on writing just one, but clearly written explanation of the core idea, I might have been more sympathetic to the project. As it is though, ‘path semantics’ is an exercise in obscurantism at best and in psychoceramics at worst.
A function "f x g" pairs up f and g and applies them separately to a tuple of arguments: (f x g)(a, b) = (f(a), g(b)).
The commutative diagram becomes clearer when we label the points:
not x not
(a, b) ---------> (not(a), not(b))
| |
and | | or
V V
and(a,b) ---------> not(and(a, b)) = or(not(a), not(b))
not
(This is the same as what user lmm wrote in prose in https://news.ycombinator.com/item?id=23203478.)As for what "path-space" notation means, even the author appears confused, since they claim that "and[not] <=> or" corresponds to "If you flip the input and output bits of an `and` function, ..." corresponds to "not(and(a, b)) = or(not(a), not(b))", but this clearly isn't the case: flipping both the inputs and outputs of `and` to get `or` would be "not(and(not(a), not(b))) = or(a, b)".
Great work!
But my overarching point is that for some large segment of programmers if you say you're working on a project called POI, they're going to think Apache POI.
who really has a problem disambiguating when searching with other keywords? it's not like search engine are hashtables. have you ever been unable to find the right thing after adding at most two keywords? even more likely that google knows if you're searching for apache poi you're not interested in theorem proving so they point you to the right entity immediately.
People love to name projects after things in physics (particles mainly) which can make googling slightly annoying although luckily 99% of the results I'm looking for are on stackexchange or arxiv.
Why the snarky reply? Notifying a project of possible conflicts that would reduce its visibility is hardly pointless.
And in this specific case, if you spend a moment looking at Apache POI, you'll see that it contains an equation solver, so yes indeed when looking for one you could need to disambiguate the results.