[Haskell-beginners] Re: Is complete decoupling and abstraction
possible in Haskell?
Tomer Libal
shaolintl at gmail.com
Fri Jan 16 07:52:31 EST 2009
Hi,
I have read the previous thread about Monads with great interest. The
abstration ideas contained in Wadler's papers gave me hope that there is a
way to do a full decoupling and abstraction in Haskell, but I have no idea
how.
I am interested in building a completely generic resolution theorem prover
that all of its parts can be implemented separately. In fact, we already
have this prover programmed in c++ but I would be glad if I can reprogram it
in Haskell for further extensions of the different parts.
The idea of the resolution prover is to get a set of clauses in clasual
logic and to try and refute them by using resolution.
Some of the parts that need to be decoupled are:
- Refinements which are datastructures that return the pair (or more) of
clauses each time that need to be processed. They are chosen according to
some heuristic, i.e. smallest clauses, etc. Each Refinement instance should
be able to return the next pair to be processed according to its inner state
and heuristics.
- Resolvers that process two clauses and tries to unify a specific literal
in each. The abstraction here deals with each resolver processing in a
different way. Some do factorization and some modulation and each one of
this processes have several kinds that should be decoupled as well (i.e.
modulator that works by a brute force BFS or in a smarter way).
- Post processors that are applied to all successfull resolvents and perform
manipulation on the Refinements states, like adding new clauses (called also
resolvents), forward subsumption, deletion of tautologies, etc.)
As an example for abstraction in the Refinement state, we have in the c++
version an interactive refinement that gets as argument another refinement
and deals with obtaining commands from the user:
- do x steps in automatic mode i.e. execute the inner refinement for x
steps.
- tries to unifies two clauses on all positions, etc.
Also the user interface module should be deoupled as it can be a simple
command like or a GUI.
My naive approach was to create a class for each abstract part of the prover
and the different instances will implement the specific implementations.
My main question is if it is feasible to achieve in Haskell and even if it
is Feasible, if such decoupling should be attempted in Haskell in the first
place or that other languages are more suitable. I guess my main question is
if projects prgrammed by several programmers with a complete decoupling
between them can be done in Haskell.
I must add that although in general Theorem provers are very performance
oriented, we are not interested in performance in our prover as it is used
mainly for testing different refinements and extensions. Therefore, we
consider haskell as well (as c++).
Also, is there a big reference project, implemented in Haskell, that
exhibits some of the OO concepts like decoupling, modulation and
abstraction? I understand functional programming has other core values like
ease of programming and easy validation of correctness but is it also
suitable for large structured projects worked on by many programmers (using
decoupling for example)?
to give an example for the main function (many parts are missing):
class Refinement a where
getClauses :: Maybe (Clause, Clause)
loop timeout refinement =
let
clauses = getClauses refinement
timedout = isTimeout t
in
if timedout then Timedout t else
case clauses of
Nothing -> Exahusted
Just (c1, c2) -> let
resolvents = unifyOnAllLiterals c1 c2 -- list of all resolvents
in
if emptyClauseIsContained resolvents
then Success unifier -- unifer is the global unifier
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20090116/b90c26fe/attachment.htm
More information about the Beginners
mailing list