diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-08 00:49:34 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-08 00:49:34 +0000 |
commit | 2dce50fbd5ef72bbcd51533cf04f8722f8139d6a (patch) | |
tree | e1d2b8447694e1199caa2e69bfdb9ebd6a45685d | |
parent | 3844776a21b3f2a1f028f76bdf06b3ff05b8fc0f (diff) |
Add arithmetic comparison predicates
-rw-r--r-- | builtins.c | 32 | ||||
-rw-r--r-- | parser.c | 2 | ||||
-rw-r--r-- | stdlib.pl | 21 |
3 files changed, 54 insertions, 1 deletions
@@ -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 @@ -382,7 +382,7 @@ initoperators(void) addoperator(700, Xfx, L"@>="); addoperator(700, Xfx, L"is"); addoperator(700, Xfx, L"=:="); - addoperator(700, Xfx, L"=\="); + addoperator(700, Xfx, L"=\\="); addoperator(700, Xfx, L"<"); addoperator(700, Xfx, L"=<"); addoperator(700, Xfx, L">"); @@ -129,3 +129,24 @@ write_canonical(Term) :- write_canonical(S, Term) :- write_term(S, Term, [quoted(true), ignore_ops(true)]). +% Arithmetic comparisons defined in terms of >=. This is not the most effective way, +% but it is fine for now. + +E1 =:= E2 :- + E1 >= E2, + E2 >= E1. + +E1 =\= E2 :- + \+ E1 =:= E2. + +E1 < E2 :- + E2 >= E1, + E1 =\= E2. + +E1 =< E2 :- + E2 >= E1. + +E1 > E2 :- + E2 < E1. + + |