diff options
-rw-r--r-- | builtins.c | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -21,6 +21,7 @@ BuiltinProto(builtinnumber); BuiltinProto(builtinstring); BuiltinProto(builtincompare); BuiltinProto(builtinfunctor); +BuiltinProto(builtinarg); int compareterms(Term *, Term *); @@ -72,6 +73,8 @@ findbuiltin(Term *goal) return builtincompare; if(Match(L"functor", 3)) return builtinfunctor; + if(Match(L"arg", 3)) + return builtinarg; return nil; } @@ -336,3 +339,27 @@ builtinfunctor(Term *database, Term *goal, Goal **goals, Choicepoint **choicesta } return 0; } + +int +builtinarg(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings) +{ + USED(database); + USED(goals); + USED(choicestack); + + Term *n = goal->children; + Term *term = n->next; + Term *arg = term->next; + + if(n->tag != NumberTerm || n->numbertype != NumberInt || n->ival < 0) + return 0; + if(term->tag != CompoundTerm) + return 0; + if(n->ival >= term->arity) + return 0; + + int i; + Term *t; + for(i = 0, t = term->children; i < n->ival; i++, t = t->next); + return unify(arg, t, bindings); +}
\ No newline at end of file |