AI-Prolog

 view release on metacpan or  search on metacpan

lib/AI/Prolog/Builtins.pod  view on Meta::CPAN


Succeeds if both terms are bound.  The value of the term is X / Y.
Use with C<is(X,Y)>.

 is(X, div(N,3)).

This is the internal form of the infix operator:
 
 N / 3.

=item eq/2

Succeeds if C<X> and C<Y> are equal.

This is the internal form of the infix operator:

 X == Y.

=item fail/0

This goal always fails.  Useful when you've reached a condition you
know should not succeed.

  kill(Hero, Beast) :-
    not(has_weapon(Hero)), fail.

=item ge/2

Succeeds if both terms are bound and X >= Y.

This is the internal form of the infix operator:

 X >= Y.

=item gt/2

Succeeds if both terms are bound and X > Y.

This is the internal form of the infix operator:

 X > Y.

=item halt/1

In the C<aiprolog> shell, exist shell.  Currently has no other effect.

=item if/3

If C<X> succeeds as a goal, try C<Y> as a goal.  Otherwise, try C<Z>.

 thief(badguy).
 steals(PERP, X) :-
   if(thief(PERP), eq(X,rubies), eq(X,nothing)).

=item is/2

If X is unbound and Y is bound to a number, the goal succeeds and X becomes
bound to the value of Y.  Otherwise, succeeds if both terms are bound, numbers,
and equal.

All other conditions result in failure.

This is the internal form of the infix operator:

 X is Y.

=item le/2

Succeeds if both terms are bound and X <= Y.

This is the internal form of the infix operator:

 X <= Y.

=item listing/0

Dumps a listing of all user-defined predicates and how they are defined.

=item listing/1

Dumps a listing of the requested predicate.  C<X> must a variable or string
instantiated in I<functor/arity>) form.  Note that, unlike most Prolog's, this
means that the followig will not work:

 listing(foo/2).

Use this instead:

 listing('foo/2').

=item lt/2

Succeeds if both terms are bound and X < Y.

This is the internal form of the infix operator:

 X < Y.

=item minus/2

Succeeds if both terms are bound.  The value of the term is X - Y.
Use with C<is(X,Y)>.

 is(X, minus(N,1)).

This is the internal form of the infix operator:

 N - 1.

=item mod/2

Succeeds if both terms are bound.  The value of the term is X % Y. (modulus)
Use with C<is(X,Y)>.

 is(X, mod(N,3)).

This is the internal form of the infix operator:

 N % 3.

=item mult/2

lib/AI/Prolog/Builtins.pod  view on Meta::CPAN

Succeeds if X is an unbound variable.  Otherwise, this goal fails.

=item write/1

Prints the current Term.  If the term is an unbound variable, it will print the
an underscore followed by the internal variable number (e.g., "_284").

 write(ovid).         % prints "ovid"
 write("Something").  % prints "Something"
 write(Something).    % prints whatever variable Something is bound to 

=item writeln/1

Same as C<write(Term)>, but automatically prints a newline at the end.

=back

=head1 LIMITATIONS

These are known limitations that I am not terribly inclined to fix.  See the
TODO list for those I am inclined to fix.

 IF -> THEN; ELSE not allowed.

Use C<if(IF, THEN, ELSE)> instead.

Chaining terms with a semicolon for "or" does not work.  Use C<or/2> instead.

=head1 TODO

There are many things on this list.  The core functionality is there, but I do
want you to be aware of what's coming.

=over 4

=item Improve printing.

There are some bugs with printing and escaping characters.  Maybe I'll look
into them :)

=item More builtins.

Currently, we only have a tiny subset of builtins available.  More are coming.

=back

=head1 MATH

Since version .70, math is fully available in C<AI::Prolog>.  Note that math is
implemented via the
L<AI::Prolog::Parser::PreProcessor::Math|AI::Prolog::Parser::PreProcessor::Math>
module.  This module rewrites Prolog math to an internal, predicate-based form
with the L<AI::Prolog::Parser|AI::Prolog::Parser> can parse.  This may cause
confusion when debugging.

 X is 5 + 7.
 % internally converted to 
 % is(X, plus(5, 7)).

The math predicates are officially deprecated and I<cannot> be used in the same
expression with regular Prolog math.  

Number may be integers, floats, doubles, etc.  A number that starts with a
minus sign (-) is considered negative.  No number may end in a decimal point as
the period is interpreted as the end of a clause.  The following is therefore a
syntax error:

 X is 5. + 7.

Unfortunately, the parser doesn't yet yell about that.  We'll try and figure
out why later.

Omit the period after the number or put a zero after it:

 X is 5.0 + 7.
 X is 5 + 7.

Because numbers use Perl scalars, you may mix types (ints and floats) and they
will behave as you expect in Perl.

Precedence is C<*> and C</>, left to right, followed by C<+> and C<->, left to
right followed by C<%>, left to right.  (I probably should change that.)
Naturally, parentheses may be used for grouping:

 X is 3 * 5 + 2.   % is(X, plus(mult(3, 5), 2)).
 X is 3 * (5 + 2). % is(X, mult(3, plus(5, 2))).

When using math, note that C<is> is similar to Perl's assignment operator, C<=>.
This can be confusing.

 X is 3 + 2.

Sets C<X> to the value of C<5>.  

If C<X> is already instantiated, this goal succeeds if the value of C<X> is the
value of the result of the right-hand side of the equation.  Internally, if X is not
instantiated, it looks like this:

 is(5, plus(3,2)).

The C<=> operator tries to unify the left-hand side with the right-hand side:

 X = 3 + 2.

If C<X> is already instantiated, this goal succeeds if the value of C<X> is the
same goal as the right-hand side of the equation.  Internally, if X is not
instantiated, it looks like this:

 eq(plus(3,2), plus(3,2)).

When you first start using Prolog, you probably was C<is> instead of C<=>.

Logical comparisons are straightforward:

 3 >= X.
 Y > (4 + 3) * X.
 X == Y. % a test for equality
 X \= Y. % Not equal.  See caveats for ne/2
 % etc.

=head1 BUGS

None known.

=head1 SEE ALSO

L<AI::Prolog::Introduction>

L<AI::Prolog>

W-Prolog:  L<http://goanna.cs.rmit.edu.au/~winikoff/wp/>

X-Prolog:  L<http://www.iro.umontreal.ca/~vaucher/XProlog/>

Roman BartE<225>k's online guide to programming Prolog:
L<http://kti.ms.mff.cuni.cz/~bartak/prolog/index.html>

=head1 AUTHOR

Curtis "Ovid" Poe, E<lt>moc tod oohay ta eop_divo_sitrucE<gt>

Reverse the name to email me.

This work is based on W-Prolog, http://goanna.cs.rmit.edu.au/~winikoff/wp/,
by Dr. Michael Winikoff.  Many thanks to Dr. Winikoff for granting me
permission to port this.

=head1 COPYRIGHT AND LICENSE

Copyright 2005 by Curtis "Ovid" Poe

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself. 

=cut



( run in 1.301 second using v1.01-cache-2.11-cpan-39bf76dae61 )