in java/com/googlecode/prolog_cafe/lang/Arithmetic.java [66:170]
public static NumberTerm evaluate(Term _t)
throws PInstantiationException,IllegalDomainException {
Term t = _t.dereference();
if (t instanceof VariableTerm)
throw new PInstantiationException();
else if (t instanceof IntegerTerm)
return (IntegerTerm)t;
else if (t instanceof DoubleTerm)
return (DoubleTerm)t;
else if (t.equals(SYM_RANDOM))
return new DoubleTerm(Math.random());
else if (t.equals(SYM_PI))
return new DoubleTerm(Math.PI);
else if (t.equals(SYM_E))
return new DoubleTerm(Math.E);
else if (t instanceof ListTerm)
return evaluate(((ListTerm)t).car());
else if (! (t instanceof StructureTerm))
throw new IllegalDomainException("arithmetic expression", t);
SymbolTerm func = ((StructureTerm)t).functor();
Term[] args = ((StructureTerm)t).args();
if (func.equals(SYM_ADD_1))
return evaluate(args[0]);
else if (func.equals(SYM_NEGATE_1))
return evaluate(args[0]).negate();
else if (func.equals(SYM_ADD_2))
return evaluate(args[0]).add(evaluate(args[1]));
else if (func.equals(SYM_SUBTRACT_2))
return evaluate(args[0]).subtract(evaluate(args[1]));
else if (func.equals(SYM_MULTIPLY_2))
return evaluate(args[0]).multiply(evaluate(args[1]));
else if (func.equals(SYM_INTDIVIDE_2))
return evaluate(args[0]).intDivide(evaluate(args[1]));
else if (func.equals(SYM_DIVIDE_2))
return evaluate(args[0]).divide(evaluate(args[1]));
else if (func.equals(SYM_MOD_2))
return evaluate(args[0]).mod(evaluate(args[1]));
else if (func.equals(SYM_REM_2))
return evaluate(args[0]).mod(evaluate(args[1]));
else if (func.equals(SYM_AND_2))
return evaluate(args[0]).and(evaluate(args[1]));
else if (func.equals(SYM_OR_2))
return evaluate(args[0]).or(evaluate(args[1]));
else if (func.equals(SYM_XOR_2))
return evaluate(args[0]).xor(evaluate(args[1]));
else if (func.equals(SYM_NOT_1))
return evaluate(args[0]).not();
else if (func.equals(SYM_SHIFTLEFT_2))
return evaluate(args[0]).shiftLeft(evaluate(args[1]));
else if (func.equals(SYM_SHIFTRIGHT_2))
return evaluate(args[0]).shiftRight(evaluate(args[1]));
else if (func.equals(SYM_ABS_1))
return evaluate(args[0]).abs();
else if (func.equals(SYM_MIN_2))
return evaluate(args[0]).min(evaluate(args[1]));
else if (func.equals(SYM_MAX_2))
return evaluate(args[0]).max(evaluate(args[1]));
else if (func.equals(SYM_RINT_1))
return evaluate(args[0]).rint();
else if (func.equals(SYM_ROUND_1))
return evaluate(args[0]).round();
else if (func.equals(SYM_FLOOR_1))
return evaluate(args[0]).floor();
else if (func.equals(SYM_CEIL_1))
return evaluate(args[0]).ceil();
else if (func.equals(SYM_SIN_1))
return evaluate(args[0]).sin();
else if (func.equals(SYM_COS_1))
return evaluate(args[0]).cos();
else if (func.equals(SYM_TAN_1))
return evaluate(args[0]).tan();
else if (func.equals(SYM_ASIN_1))
return evaluate(args[0]).asin();
else if (func.equals(SYM_ACOS_1))
return evaluate(args[0]).acos();
else if (func.equals(SYM_ATAN_1))
return evaluate(args[0]).atan();
else if (func.equals(SYM_SQRT_1))
return evaluate(args[0]).sqrt();
else if (func.equals(SYM_LOG_1))
return evaluate(args[0]).log();
else if (func.equals(SYM_EXP_1))
return evaluate(args[0]).exp();
else if (func.equals(SYM_POW_2))
return evaluate(args[0]).pow(evaluate(args[1]));
else if (func.equals(SYM_DEGREES_1))
return evaluate(args[0]).toDegrees();
else if (func.equals(SYM_RADIANS_1))
return evaluate(args[0]).toRadians();
else if (func.equals(SYM_SIGN_1))
return evaluate(args[0]).signum();
else if (func.equals(SYM_FLOAT_1))
return evaluate(args[0]).toFloat();
else if (func.equals(SYM_INTPART_1))
return evaluate(args[0]).floatIntPart();
else if (func.equals(SYM_FRACTPART_1))
return evaluate(args[0]).floatFractPart();
else if (func.equals(SYM_TRUNCATE_1))
return evaluate(args[0]).truncate();
else
throw new IllegalDomainException("arithmetic expression", t);
}