summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-06-30 21:38:34 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-06-30 21:38:34 +0000
commita106f8db4ec30b159c0fcef120c3e8b55b3ffdb8 (patch)
tree3d4617187a3b5e2782093b05d7c5cf7ceacdbe74 /builtins.c
parentafbd56887b77e28f67373e1a3acae36e242fcf50 (diff)
Add arg/3
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c27
1 files changed, 27 insertions, 0 deletions
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