From: Stefan Israelsson Tampe <stefan.itampe@gmail.com>
To: guile-devel <guile-devel@gnu.org>
Subject: Some guile-unify activities
Date: Fri, 6 May 2011 23:18:05 +0200 [thread overview]
Message-ID: <BANLkTi=Sjr28mMKR5JGNM8A6s9YgKVRGeQ@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 6835 bytes --]
Hi,
Just wanted to chime in and tell you a little about what I'm doing with the
guile-unify package.
First off, this is a tool to do backtracking effectively e.g. tree searches
and make heavy use of
dynamic variables.
There is three activities ongoing.
1. type-checking examples
2. first order logic solvers (porting leanCop)
3. documentation
1. Documentation, I needed to recap somethings and started to improve on the
examples above in order to achieve
higher generality. As it turned out bug's in the underlying code is squashed
all the time and new useful features for the
macro package is dicoverwed. So the codebase is in a pretty fluent state
still. On the other hand some of the basic features
is being documented.
2. The core part of the first order logic leanCop solver has been translated
to a macro package and are now in a pure scheme form. It's not that
advanced. Then there is a language for how to state the problem especially a
translational tool to gather information from a
database of first order logic problems. The idea now is to mod that tool
into spitting out a file of of the translation which are working
then call guile and let guile read in that file and process it with the core
solver. The idea is to test out a few alternative solving teqniques
and evaluate their performance for the database.
3. For the type-checking examples I've been working with the assumptions of
having fixed declarations for
lambdas and deduce types for variables and their passage through the system.
The thought is that in the end
one need to allow lambdas to be explicitly typed in order to allow advanced
type-checking and at the same time
avoid infinite recursions. I think that it's not uncommon in Haskell
programming to add type information in order
to guide the type checker and being at such an infant stage having something
useful and working must simple allow
for type hint's in the code.
It would be cool to let emacs interact with guile to give a tool to
automagically construct
type signatures aka
(lambda (A) B) <enter>
--> (lambda (integer) integer)
E.g. be able to interactively deduce a type signature.
I will try to add more type primitives like recursive types and so on to be
able to match Haskel and typed racket.
Generally the biggest problem with backtracking is complexity issues. One
can design relatively small programs
that makes the type checker work for ages. i will not adress this right now
but there are plenty of short cut's to be taken
in order to speed up the checker.
It would be good if there was a standard way to enter type information in
guile and if that information could be hooked into the
tree-il representation. But until then I will just use a simple macro
framework to enter typed functions.
To note below if a lambda produces (or a b) then the rest of the code has to
be tried with a and when checked then backtrack and be tried with b
if both are type checked then we can proceed. (this is the naive and simple
implementation) So we can have a general type checker but complexity wise
it will be awful.
-------------------------------------------------------------------------------------------
So now this works in 1 sec,
********************** Code (have a geometric explosion in complexity e.g.
works like 1000 lines of code) ******************
(tdefine (f X)
(type (lambda (boolean) (or integer symbol)) ;; type signature is (type
type-desc code ...) and gives a type hint to the lambda
(let ((F (lambda (P)
(type (lambda (boolean) (or integer symbol))
(if P 1 's)))))
(F #t)
(F #t)
(F #t)
(F #t)
(F #t)
(F #t)
(F #t)
(F #t)
(F #t)
(F #f))))
************************************************** first stage compiled
code ***********************************
(check (lambda ((#{X\ 10764}# : boolean))
:
(or integer symbol)
(begin
(let #{F\ 10770}# (lambda
((#{P\ 10771}# : boolean))
:
(or integer symbol)
(begin (if #{P\ 10771}# 1 (quote s))))
(begin
(begin
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#t))
(apply #{F\ 10770}# (#f))))))))
----------------------------------------------------------
**************************************** Deduced Equation
*******************************
((= (lambda #<procedure 2a55800 at
language/prolog/typecheck/equationalize.scm:72:2 ()>)
Tres)
((= #{X\ 10764}# boolean)
(= (lambda #<procedure 2a55760 at
language/prolog/typecheck/equationalize.scm:72:2 ()>)
#{F\ 10770}#)
((= #{P\ 10771}# boolean)
(or ((= (res #{P\ 10771}#) boolean)
(= (res integer) (or integer symbol)))
((= (res #{P\ 10771}#) boolean)
(= (res symbol) (or integer symbol)))))
(= (res #{F\ 10770}#)
(lambda (arg Targ10777) Tres10778))
(= (res boolean) (arg Targ10777))
(= (res Tres10778) A10776)
(= (res #{F\ 10770}#)
(lambda (arg Targ10780) Tres10781))
(= (res boolean) (arg Targ10780))
(= (res Tres10781) A10779)
(= (res #{F\ 10770}#)
(lambda (arg Targ10783) Tres10784))
(= (res boolean) (arg Targ10783))
(= (res Tres10784) A10782)
(= (res #{F\ 10770}#)
(lambda (arg Targ10786) Tres10787))
(= (res boolean) (arg Targ10786))
(= (res Tres10787) A10785)
(= (res #{F\ 10770}#)
(lambda (arg Targ10789) Tres10790))
(= (res boolean) (arg Targ10789))
(= (res Tres10790) A10788)
(= (res #{F\ 10770}#)
(lambda (arg Targ10792) Tres10793))
(= (res boolean) (arg Targ10792))
(= (res Tres10793) A10791)
(= (res #{F\ 10770}#)
(lambda (arg Targ10795) Tres10796))
(= (res boolean) (arg Targ10795))
(= (res Tres10796) A10794)
(= (res #{F\ 10770}#)
(lambda (arg Targ10798) Tres10799))
(= (res boolean) (arg Targ10798))
(= (res Tres10799) A10797)
(= (res #{F\ 10770}#)
(lambda (arg Targ10801) Tres10802))
(= (res boolean) (arg Targ10801))
(= (res Tres10802) A10800)
(= (res #{F\ 10770}#)
(lambda (arg Targ10803) Tres10804))
(= (res boolean) (arg Targ10803))
(= (res Tres10804) (or integer symbol))))
;;; compiled
/home/stis/stis/src/guile/cache/guile/ccache/2.0-0.S-LE-8/home/stis/stis/src/guile/module/language/typed-guile/test.scm.go
************************************************************* Verdict
defined f : (lambda (arg boolean) (or integer symbol))
$1 = #t
/Stefan
[-- Attachment #2: Type: text/html, Size: 7403 bytes --]
next reply other threads:[~2011-05-06 21:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-06 21:18 Stefan Israelsson Tampe [this message]
2011-05-06 21:26 ` Some guile-unify activities Noah Lavine
2011-05-08 15:38 ` Ludovic Courtès
2011-05-08 15:52 ` Andy Wingo
2011-05-09 11:15 ` Stefan Israelsson Tampe
2011-05-09 12:42 ` Andy Wingo
2011-05-09 18:35 ` Stefan Israelsson Tampe
2011-05-09 21:46 ` Andy Wingo
2011-05-10 9:00 ` Stefan Israelsson Tampe
2011-05-10 9:15 ` Andy Wingo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='BANLkTi=Sjr28mMKR5JGNM8A6s9YgKVRGeQ@mail.gmail.com' \
--to=stefan.itampe@gmail.com \
--cc=guile-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).