summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-08 00:49:34 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-08 00:49:34 +0000
commit2dce50fbd5ef72bbcd51533cf04f8722f8139d6a (patch)
treee1d2b8447694e1199caa2e69bfdb9ebd6a45685d /builtins.c
parent3844776a21b3f2a1f028f76bdf06b3ff05b8fc0f (diff)
Add arithmetic comparison predicates
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/builtins.c b/builtins.c
index 885db3c..5e1dc58 100644
--- a/builtins.c
+++ b/builtins.c
@@ -46,6 +46,7 @@ BuiltinProto(builtinsetinput);
BuiltinProto(builtinsetoutput);
BuiltinProto(builtinreadterm);
BuiltinProto(builtinwriteterm);
+BuiltinProto(builtingeq);
int compareterms(Term *, Term *);
@@ -127,6 +128,8 @@ findbuiltin(Term *goal)
return builtinreadterm;
if(Match(L"write_term", 3))
return builtinwriteterm;
+ if(Match(L">=", 2))
+ return builtingeq;
return nil;
}
@@ -777,3 +780,32 @@ builtinwriteterm(Term *goal, Binding **bindings, Module *module)
writeterm(stream, options, term);
return 1;
}
+
+int
+builtingeq(Term *goal, Binding **bindings, Module *module)
+{
+ USED(bindings);
+ USED(module);
+ Term *a = goal->children;
+ Term *b = a->next;
+
+ int waserror;
+ Term *aval = aritheval(a, &waserror);
+ if(waserror)
+ Throw(aval);
+
+ Term *bval = aritheval(b, &waserror);
+ if(waserror)
+ Throw(bval);
+
+ if(aval->tag == IntegerTerm && bval->tag == IntegerTerm)
+ return aval->ival >= bval->ival;
+ else if(aval->tag == FloatTerm && bval->tag == FloatTerm)
+ return aval->dval >= bval->dval;
+ else if(aval->tag == IntegerTerm && bval->tag == FloatTerm)
+ return aval->ival >= bval->dval;
+ else if(aval->tag == FloatTerm && bval->tag == IntegerTerm)
+ return aval->dval >= bval->ival;
+ else
+ return 0;
+} \ No newline at end of file