diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-30 21:38:34 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-30 21:38:34 +0000 |
commit | a106f8db4ec30b159c0fcef120c3e8b55b3ffdb8 (patch) | |
tree | 3d4617187a3b5e2782093b05d7c5cf7ceacdbe74 /builtins.c | |
parent | afbd56887b77e28f67373e1a3acae36e242fcf50 (diff) |
Add arg/3
Diffstat (limited to 'builtins.c')
-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 |