00001
00002 import java.io.IOException;
00003 import java.net.UnknownHostException;
00004
00005 import org.apache.log4j.Logger;
00006 import org.opencyc.api.CycAccess;
00007 import org.opencyc.api.CycApiException;
00008 import org.opencyc.api.CycObjectFactory;
00009 import org.opencyc.cycobject.CycConstant;
00010 import org.opencyc.cycobject.CycList;
00011 import org.opencyc.cycobject.CycVariable;
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 public class AlgorithmicsSingleton {
00025 private CycAccess cycAccess = null;
00026
00027 private static AlgorithmicsSingleton instance;
00028
00029 private Logger logger = Logger.getLogger(getClass());
00030
00031 public static AlgorithmicsSingleton getInstance() {
00032 if (instance == null) {
00033 instance = new AlgorithmicsSingleton();
00034 }
00035 return instance;
00036 }
00037
00038 protected AlgorithmicsSingleton() {
00039 String factorialFunction = null;
00040 try {
00041 cycAccess = new CycAccess();
00042
00043 factorialFunction = "(DEFINE FACTORIAL (x) " +
00044 " (PIF (> x 1) " +
00045 " (* x (FACTORIAL (- x 1))) " +
00046 " 1))";
00047
00048 cycAccess.converseVoid(factorialFunction);
00049 } catch (CycApiException exception) {
00050 this.logger.error("", exception);
00051 } catch (UnknownHostException exception) {
00052 this.logger.error("", exception);
00053 } catch (IOException exception) {
00054 this.logger.error("", exception);
00055 }
00056 }
00057
00058 private double calculateWithCyc(String op, double number1, double number2) {
00059 Number result = null;
00060
00061 try {
00062 result = (Number) this.cycAccess.converseObject("(" + op + " "
00063 + number1 + " " + number2 + ")");
00064 return result.doubleValue();
00065 } catch (CycApiException exception) {
00066 this.logger.error("", exception);
00067 } catch (UnknownHostException exception) {
00068 this.logger.error("", exception);
00069 } catch (IOException exception) {
00070 this.logger.error("", exception);
00071 }
00072 return 0.;
00073
00074 }
00075
00076 public double subtract(double number1, double number2) {
00077 return calculateWithCyc("-", number1, number2);
00078 }
00079
00080 public double add(double number1, double number2) {
00081 return calculateWithCyc("+", number1, number2);
00082 }
00083
00084 public double multiply(double number1, double number2) {
00085 return calculateWithCyc("*", number1, number2);
00086 }
00087
00088 public double divide(double number1, double number2) {
00089 return calculateWithCyc("/", number1, number2);
00090 }
00091
00092 public double square(double number1) {
00093 return multiply(number1, number1);
00094 }
00095
00096 public double exp(double number1, double number2) {
00097 Number result = null;
00098 CycList query = null;
00099 CycVariable sumVariable = null;
00100 CycConstant microTheory=null;
00101 CycList response=null;
00102
00103 try {
00104 query = CycAccess.current().makeCycList("(#$evaluate ?SUM " +
00105 "(#$ExponentFn " + number1 + " " + number2 + "))");
00106 sumVariable = CycObjectFactory.makeCycVariable("?SUM");
00107
00108 microTheory=this.cycAccess.getConstantByName("UniversalVocabularyMt");
00109 response = CycAccess.current().askWithVariable(query,
00110 sumVariable, microTheory);
00111
00112 result = (Number) response.iterator().next();
00113
00114 return result.intValue();
00115 } catch (CycApiException exception) {
00116 this.logger.error("", exception);
00117 } catch (UnknownHostException exception) {
00118 this.logger.error("", exception);
00119 } catch (IOException exception) {
00120 this.logger.error("", exception);
00121 }
00122
00123 return 0.;
00124 }
00125
00126 public int factorial(double number1) {
00127 Number result = null;
00128
00129 try {
00130 result = (Number) this.cycAccess.converseObject("(FACTORIAL "
00131 + number1 + ")");
00132 return result.intValue();
00133 } catch (CycApiException exception) {
00134 this.logger.error("", exception);
00135 } catch (UnknownHostException exception) {
00136 this.logger.error("", exception);
00137 } catch (IOException exception) {
00138 this.logger.error("", exception);
00139 }
00140 return 0;
00141
00142 }
00143
00144 public double modulo(double number1, double number2) {
00145 return calculateWithCyc("MOD", number1, number2);
00146 }
00147 }