ref: a8b1fadd149126e9c8d3081a56d206812211f1e6
dir: /builtins.c/
#include <u.h>
#include <libc.h>
#include "dat.h"
#include "fns.h"
#define BuiltinProto(name) int name(Term *, Term *, Goal **, Choicepoint **, Binding **)
#define Match(X, Y) (runestrcmp(name, X) == 0 && arity == Y)
BuiltinProto(builtinfail);
BuiltinProto(builtincall);
BuiltinProto(builtincut);
BuiltinProto(builtinvar);
BuiltinProto(builtinatom);
BuiltinProto(builtininteger);
BuiltinProto(builtinfloat);
BuiltinProto(builtinatomic);
BuiltinProto(builtincompound);
BuiltinProto(builtinnonvar);
BuiltinProto(builtinnumber);
BuiltinProto(builtinstring);
Builtin
findbuiltin(Term *goal)
{
int arity;
Rune *name;
switch(goal->tag){
case AtomTerm:
arity = 0;
name = goal->text;
break;
case CompoundTerm:
arity = goal->arity;
name = goal->text;
break;
default:
return nil;
}
/* Rewrite this so its not just a long if chain */
if(Match(L"fail", 0))
return builtinfail;
if(Match(L"call", 1))
return builtincall;
if(Match(L"!", 0))
return builtincut;
if(Match(L"var", 1))
return builtinvar;
if(Match(L"atom", 1))
return builtinatom;
if(Match(L"integer", 1))
return builtininteger;
if(Match(L"float", 1))
return builtinfloat;
if(Match(L"atomic", 1))
return builtinatomic;
if(Match(L"compound", 1))
return builtincompound;
if(Match(L"nonvar", 1))
return builtinnonvar;
if(Match(L"number", 1))
return builtinnumber;
if(Match(L"string", 1))
return builtinstring;
return nil;
}
int
builtinfail(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goal);
USED(goals);
USED(choicestack);
USED(bindings);
return 0;
}
int
builtincall(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(choicestack);
USED(bindings);
Goal *g = malloc(sizeof(Goal));
g->goal = goal->children;
g->next = *goals;
*goals = g;
return 1;
}
int
builtincut(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(bindings);
Choicepoint *cp = *choicestack;
/* Cut all choicepoints with an id larger or equal to the goal clause number, since they must have been introduced
after this goal's parent.
*/
while(cp != nil && cp->id >= goal->clausenr)
cp = cp->next;
*choicestack = cp;
return 1;
}
int
builtinvar(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == VariableTerm);
}
int
builtinatom(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == AtomTerm);
}
int
builtininteger(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == NumberTerm && arg->numbertype == NumberInt);
}
int
builtinfloat(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == NumberTerm && arg->numbertype == NumberFloat);
}
int
builtinatomic(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == AtomTerm || arg->tag == NumberTerm);
}
int
builtincompound(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == CompoundTerm);
}
int
builtinnonvar(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag != VariableTerm);
}
int
builtinnumber(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == NumberTerm);
}
int
builtinstring(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
{
USED(database);
USED(goals);
USED(choicestack);
USED(bindings);
Term *arg = goal->children;
return (arg->tag == StringTerm);
}