From 2dce50fbd5ef72bbcd51533cf04f8722f8139d6a Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 8 Jul 2021 00:49:34 +0000 Subject: Add arithmetic comparison predicates --- builtins.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'builtins.c') 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 -- cgit v1.2.3