From a106f8db4ec30b159c0fcef120c3e8b55b3ffdb8 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 30 Jun 2021 21:38:34 +0000 Subject: Add arg/3 --- builtins.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'builtins.c') diff --git a/builtins.c b/builtins.c index 3008513..c2afd4e 100644 --- a/builtins.c +++ b/builtins.c @@ -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 -- cgit v1.2.3