rlepigre / pml Goto Github PK
View Code? Open in Web Editor NEWNew version of the PML language and (classical) proof assistant
Home Page: http://pml-lang.org
License: MIT License
New version of the PML language and (classical) proof assistant
Home Page: http://pml-lang.org
License: MIT License
Reexamine the syntax and see if the current choice are the best ...
Here, we put all use case that seems to be solvable (or that even work in subml):
This issue should probably never be closed.
insert_t_node should use a stack to avoid creating node for partially applied function.
For instance, adding [add n p] to the pool also adds [add n] which is a lambda, hence trigger a cloture construction.
This cost is dominating "equiv" when computation are really needed, with
probably a factor much greater that 2 (10 ?) to gain.
Here we put reference to cases were the incompleteness of typing seems not reasonable.
This issue should probably never be closed.
test/fifo.pml: an annotation (x:a) is needed and this seems strange.
The current implementation seems to work but should be checked.
The risk is to loose some equivalence/normalisation propagation
when a unification variable gets instanciated.
HApp node are also concerned as their head is often an uninstanciated
unification variable.
An equation like x = S[x] learn in the pool does not yield a contradiction. Moreover,
using any function on x is likely to loop after that. We should detect such cycle.
Strangely, such cycle never appears in PML2 while they were frequent in PML1 ...
Probably not. Moreover, positivity is probably useless, relation o1 < o2 are enough (as it implies o2 > 0)
But still do we need to know in the pool that o1 < o2 is true ... Probably not ?
The document with the theory should be added to the git repository.
Only very simple cases are handled by Typing.is_singleton.
Some quantification or Impl could be allowed.
When we learn that functions are equal, we should keep that information:
VN_LAbs should contain a list of functions.
This would allow to always deduce f x = g x from f = g
Currently, we use in subtyping a heuristic testing is the term (int t : A < B) is a value.
This heuristic seems in fact to test if we already unrolled fixpoint ... And is
not so clear.
As a side effect, this heuristic forces subtyping of sums to use introduce a term
Preventing to replace the current term in a case anlysis with only one case with
a witness.
But this term with one case produce useless computation in the pool and useless
case analysis in auto_prove.
Use case in test/old_mccarthy91.pml
Epsilons should be prionted as the name of a bound variable that wes subsituted
with the epsilon. When epsilons are known to be equal, a "best" name should be chosen.
Unification variable that remains after type-checking should
get a default instanciation.
Remark: if later we keep unification constraints, this would become very
important as there could be unsolvable contraints, or preferably, we should ensure all constraints have a default instanciation that we could use.
Minimal syntactic { include r1; include r2; ... } should use typing to know the field that are present.
The same notation for type is just some kind of higher order function performing some computation on type.
The general include for a record of unknown type (or default record value) seems too hard at the moment,
especially for compilation.
In function which are very frequently called, log and chrono can cost a lot.
If I uncomment the log in add_term and add_valu, the cost of log+chorno in Equiv and
Compare is a factor between 2 and 3.
we should create a binary "main.native" where this log/chrono on small function are disabled
(keeping still the main one like typing) and a main.debug with all log and chrono.
Reference this issue in .pml file when we are not satisfied.
When instantiating a unification variable of sort value with an expression
in the pool which is not a value, this does not trigger trying to prove that this a
value in auto_prove. Moreover, fixing this is not enough because one should
build a term which is a value to perform the instantiation.
Will only be useful when assuming inequivalence, which is not really possible currently.
Probably useless ... wait for a use case.
Some time, extra information comes from typing which allows to
restrict cases. This information is probably available in the type of the VWit ...
We should try to use it!
See lib/int.pml for a use case.
the binder in all pool node (equiv.ml module) should be replaced
by closure.
This will allow to know that
a = b => (fun x y -> y x) a = (fun x y -> y x) b
without using an oracle
Mutually inductive types can be encoded using extra parameters, but this result
in a notion of sized type which is not the one we want, and leads to failure
of the termination checker.
Position absent or wrong to often
Perform a case analysis based on blocked case in evaluation. Could also do case analysis convergent/non convergent (pml1 does it)
various forbidden case due to sorting that have no error generated
Managing totality manually is too painful.
Should be annotated on the arrow type.
This is needed for GADT and will result in a better syntax too:
type rec list = [ Nil ; Cons of a * list ]
will become
type rec list = [ Nil ; Cons of a * list ]
This is needed to write subtyping proof manually (and checking termination giving exact induction hyp).
Need a use case first ?
To do as in subml, we need this.
It relies on higher-order ?
Parents are only useful for the root of the union-find data structure. We should change the data structure
to only keep the parent of roots in the union-find.
Currently make doc, is just for developer (ocamldoc of files)
Printing has been improved, but is not finished ... quite a few syntactic sugar are missing.
Notably terms in values, cons, nil, infix, ...
When writing
let f = fun x ...
or even applications, or dependant product, we have no short way to indicate the current totality we want.
Do we need something (like more than one keyword for fun ?)
When 0000032 is solved, we will know ...
Does not seem usefull.
See test/infinite.pml
There is a FIXME in the code ... Don't know what should be done
Can add the equations that were proved for mu-abstraction and named terms:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.