/************************************************************************ * Copyright \u00a9 2007, 2008 - General Electric Company, All Rights Reserved * * Project: SADL * * Description: The Semantic Application Design Language (SADL) is a * language for building semantic models and expressing rules that * capture additional domain knowledge. The SADL-IDE (integrated * development environment) is a set of Eclipse plug-ins that * support the editing and testing of semantic models using the * SADL language. * * This software is distributed "AS-IS" without ANY WARRANTIES * and licensed under the Eclipse Public License - v 1.0 * which is available at http://www.eclipse.org/org/documents/epl-v10.php * ***********************************************************************/ /*********************************************************************** * $Author: crapo $ * $Revision: 1.1 $ Last modified on $Date: 2013/08/06 17:06:20 $ ***********************************************************************/ package com.ge.research.sadl.jena.reasoner.builtin; import com.hp.hpl.jena.graph.Node; import com.hp.hpl.jena.reasoner.rulesys.BindingEnvironment; import com.hp.hpl.jena.reasoner.rulesys.RuleContext; import com.hp.hpl.jena.reasoner.rulesys.Util; import com.hp.hpl.jena.reasoner.rulesys.builtins.BaseBuiltin; public class Pow extends BaseBuiltin { /** * Return a name for this builtin, normally this will be the name of the * functor that will be used to invoke it. */ public String getName() { return "pow"; } /** * Return the expected number of arguments for this functor or 0 if the number is flexible. */ public int getArgLength() { return 3; } /** * This method is invoked when the builtin is called in a rule body. * @param args the array of argument values for the builtin, this is an array * of Nodes, some of which may be Node_RuleVariables. * @param length the length of the argument list, may be less than the length of the args array * for some rule engines * @param context an execution context giving access to other relevant data * @return return true if the buildin predicate is deemed to have succeeded in * the current environment */ public boolean bodyCall(Node[] args, int length, RuleContext context) { checkArgs(length, context); BindingEnvironment env = context.getEnv(); Node n1 = getArg(0, args, context); Node n2 = getArg(1, args, context); if (n1.isLiteral() && n2.isLiteral()) { Object v1 = n1.getLiteralValue(); Object v2 = n2.getLiteralValue(); Node pow = null; if (v1 instanceof Number && v2 instanceof Number) { Number nv1 = (Number)v1; Number nv2 = (Number)v2; if (v1 instanceof Float || v1 instanceof Double || v2 instanceof Float || v2 instanceof Double) { double pwd = Math.pow(nv1.doubleValue(), nv2.doubleValue()); pow = Util.makeDoubleNode(pwd); } else { long pwd = (long) Math.pow(nv1.longValue(),nv2.longValue()); pow = Util.makeLongNode(pwd); } return env.bind(args[2], pow); } } // Doesn't (yet) handle partially bound cases return false; } }