Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

Ovid (2709)

Ovid
  (email not shown publicly)
http://publius-ovidius.livejournal.com/
AOL IM: ovidperl (Add Buddy, Send Message)

Stuff with the Perl Foundation. A couple of patches in the Perl core. A few CPAN modules. That about sums it up.

Journal of Ovid (2709)

Friday January 21, 2005
12:21 AM

AI::Prolog not too far away

[ #22820 ]

After an agonizing amount of time tracking down my last bug, I finally nailed it. Apparently I had no (known) bugs remaining in my Prolog engine. Instead, I had a small typo in my Prolog program. It's going to take a while to get it ready for the CPAN because there's a fair amount of code and it's very complicated, but there will be an AI::Prolog on the CPAN. I was actually thinking about calling it AI::Logic, but the current implementation is pretty tightly tied to Prolog and I'm still dabbling with a different parser that would be more "perlish" (based on the Warren Abstract Machine, if anyone cares.)

In any event, here's one of the sample programs:

#!/usr/local/bin/perl -l

use strict;
use warnings;
use lib '../lib/';
use aliased 'AI::Prolog::Parser';
use aliased 'AI::Prolog::Term';
use aliased 'AI::Prolog::Engine';

my $parser = Parser->new("append(X,Y,[a,b,c,d]).");
my $query  = Term->new($parser);
my $engine = Engine->new($query,Parser->consult(append_prog()));

print $engine->run;
while (my $result = $engine->more) {
    print $result;
}

sub append_prog {
    "append([], X, X)."
   ."append([W|X],Y,[W|Z]) :- append(X,Y,Z).";
}

And the output:

append([],[a,b,c,d],[a,b,c,d])
append([a],[b,c,d],[a,b,c,d])
append([a,b],[c,d ],[a,b,c,d])
append([a,b,c],[d],[a,b,c,d])
append([a,b,c,d],[],[a,b,c,d])

I also want a method that will allow it to return "Perlish" data structures.

So far the code seems to be running ~ 1000 LIPS (Logical Inferences Per Second) and that is with no optimization (this means it appears to run about as fast as the Java applet.) I want to wait until I have a solid test suite and some decent documentation before I start profiling and optimizing.

If you really want to see the (hideous) code, you can download it, but it's not even an alpha yet. There are only a handful of tests and no docs, but if you cd into the examples directory, you can run the three programs there (the benchmark won't make much sense.) If you have any questions, post them here.

Side note: back in 1992, it was noted that decent Prolog implementations ran at about 10,000 to 100,000 LIPS. Needless to say, I have a long way to go and I don't expect to get there unless I switch to Inline::C for some bits.

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • ...I want to wait until I have a solid test suite and some decent documentation before I start profiling and optimizing.
    Shouldn't you have done that first? ;)

    I've been trying to follow all your posts, but I just don't understand 'em. Why have you put a lot of energy into that whole thief stealin' thing?
    • I didn't write the tests firsts because I was porting this from W-Prolog and frankly, since I wasn't entirely certain what W-Prolog was doing half the time, I wasn't certain what I was writing tests for. However, by doing a faithful port from a known-good program, I could run them in parallel and keep the Perl one working properly. Now that it appears that I've nailed down the behavior of the Perl version, I'm writing tests. Curiously, in the process I've found a discrepancy between the Java and Perl ver

      • but WAY above my level of comprehension. :)

        - Jason
        • Actually, I doubt it's above your level of comprehension. Logic programming isn't that hard, it's just a weird way of looking at things. For example, remember syllogisms in logic class?

          All cats are mammals.
          All mammals have fur.
          Therefore, all cats have fur.

          In prolog:

          mammal(cat).

          furry(X) :-
              mammal(X),
              not(shaved(X)).

          The :- is read as "if" and the comma is read as "and". I'm sure you can figure out what that means :)

          In logic programming, you don't tell the computer how t

          • I actually laughed out loud about the shaved part - guess it helps to start with a simpler explanation.

            I can see how it's kind of neat, especially getting computers to figure things out. I'm still stuck at seeing this, though, as a static set of switches. How is it learning or going beyond what you provide it? I mean, it seems like you're still having to provide a lot. When you say another mammal, it's only b/c you ruled that mammals have fur (and aren't shaved) that the mammal is furry. But you're st
  • What exactly is AI::Prolog going to do?
    • In the long term, the intent is to allow logic programming in Perl. However, I realize now that many people don't know what that is, so I'll write another entry to explain it. It's fascinating, but not something done much in Perl (because Perl has no native ability to do that, aside from a limited equivalent with regular expressions).

      • I like the sound of this. I've not tried to build SWI-Prolog and either of the XS modules that wrap it, but would like to have some Prolog-ish rulesets once in a while. The prior attempt [cpan.org] at a Prolog-in-Perl hasn't moved in years. Starting over with the WAM (Warren Abstract Machine) [searchspaniel.com] Prolog engine sounds good to me. (Yes, I did some Prolog back during the AI wars.)

        For those that don't know what we're talking about, you might want to check out a Prolog Tutorial [google.com], there are quite a few available.

        In the long

        --
        Bill
        # I had a sig when sigs were cool
        use Sig;
        • Actually, I have downloaded the WAM book and started working with it, but I don't have as much free time as I would like. That could be a very long project and the current implementation actually works (and also appears to be based on WAM, but it doesn't fully implement it.)