AI-Prolog
view release on metacpan or search on metacpan
bin/aiprolog view on Meta::CPAN
if ($file) {
open FH, "< $file" or die "Could not open ($file) for reading: $!";
$program = do { local $/; <FH> };
}
my $prolog = Prolog->new($program);
my $version = Prolog->VERSION;
print $OUT <<"END_WELCOME";
Welcome to AI::Prolog v $version
Copyright (c) 2005-2006, Curtis "Ovid" Poe.
AI::Prolog comes with ABSOLUTELY NO WARRANTY. This library is free software;
you can redistribute it and/or modify it under the same terms as Perl itself.
Type 'help.' for for a list of built-ins or 'help("\$builtin").' for help on a
specific built-in.
END_WELCOME
my $COMMAND = qr/^%\s*/;
my $RESULTS = 0;
my $MORE = 1;
while ($prolog->continue) {
my $query = $term->readline("?- ");
chomp $query;
next unless $query;
$term->addhistory($query);
print $OUT "\n";
if ( $query =~ /^\s*\?/ ) {
help();
next;
}
elsif ( $query =~ $COMMAND ) {
last if $query =~ /$COMMAND?(?:halt|quit|exit|stop)/i;
if ($query =~ /$COMMAND(?:help)/i) {
help();
}
elsif ($query =~ /${COMMAND}more/i) {
$MORE = 1;
}
elsif ($query =~ /${COMMAND}no\s*more/i) {
$MORE = 0;
}
next;
}
eval {$prolog->query($query)};
if ($@) {
warn $@;
next;
}
$RESULTS = 1;
show_results($prolog);
while ($MORE && user_wants_more()) {
show_results($prolog);
}
}
sub show_results {
return unless $RESULTS;
my ($prolog) = @_;
my $results = $prolog->results;
$results ||= ''; # otherwise it's an arrayref
print $OUT $results, " ";
unless ($results) {
print $OUT "No\n";
$RESULTS = 0;
}
}
sub user_wants_more {
return unless $RESULTS;
ReadMode 'cbreak';
my $key = ReadKey(0);
ReadMode 'normal';
if (';' eq $key) {
print $OUT ";\n\n";
return 1;
}
print $OUT "\n\nYes\n" if $RESULTS;
return;
}
my $offset;
sub help {
$offset ||= tell DATA;
seek DATA, $offset, 0;
pod2usage({
-verbose => 2,
-input => \*DATA,
-exitval => 'NOEXIT',
});
}
__DATA__
=head1 NAME
aiprolog -- A simple Prolog shell using AI::Prolog.
=head1 SYNOPSIS
usage: aiprolog <optional prolog program name>
=head1 DESCRIPTION
C<aiprolog> is a simple prolog shell using L<AI::Prolog> as the backend.
See the documentation for more detail on the Prolog features that L<AI::Prolog>
currently accepts.
=head2 Commands
Commands specific to aiprolog shell:
"% more" -- enables prompting for more results (default)
"% no more" -- disables prompting for more results
"% nomore" -- same as "no more"
"% halt" -- stops the shell
"% help" -- display this message
Note that the percent sign must preceed the command. The percent sign
indicates a Prolog comment. Without that, aiprolog will think you're trying to
execute a prolog command.
aiprolog-specific commands are case-insensitive.
=head2 Typical session
Save the following to a file named "append.pro":
append([],X,X).
append([W|X], Y, [W|Z]) :- append(X,Y,Z).
Then load it into the C<aiprolog> shell by typing this at a shell:
aiprolog path/to/append.pro
Alternatively, once in the shell, you can load the program with:
consult('path/to/append.prog').
In the shell, you should be greeted by a query prompt "?-". At this prompt,
you can issue queries against the program. Try entering the following query:
( run in 0.657 second using v1.01-cache-2.11-cpan-39bf76dae61 )