00001 package instruction.exporter;
00002 
00003 import instruction.opencyc.OpenCyc;
00004 
00005 import java.io.IOException;
00006 import java.net.UnknownHostException;
00007 import java.util.ArrayList;
00008 import java.util.HashMap;
00009 import java.util.Iterator;
00010 import java.util.List;
00011 import java.util.Map;
00012 import org.opencyc.api.CycAccess;
00013 import org.opencyc.api.CycApiException;
00014 import org.opencyc.api.CycObjectFactory;
00015 import org.opencyc.cycobject.CycFort;
00016 import org.opencyc.cycobject.CycList;
00017 import org.opencyc.cycobject.CycObject;
00018 import org.opencyc.cycobject.CycVariable;
00019 
00020 public class PlanExporter {
00021         public static final String MT_UNIVERSAL_VOCABULARY = "#$UniversalVocabularyMt";
00022         public static final String MT_TUM_KITCHEN_ENVIRONMENT = "#$TUMKitchenEnvironmentMt";
00023         public static final String MT_TUM_KITCHEN_ENVIRONMENT_PLANNING = "#$TUMKitchenEnvironmentPlanningMt";
00024 
00025         private static String[] spatialRelations = { "TopSide", "RightSide",
00026                         "BottomSide", "CornerOnObject", "CenterOfGeographicalRegion",
00027                         "FrontSide", "Side" };
00032         private ArrayList<String> plan;
00033 
00034         private HashMap<String, String> rplName; 
00035 
00040         private HashMap<String, String> actionTypes;
00041 
00048         private HashMap<String, CycList> actionParameters;
00049 
00055         private HashMap<String, CycList> objects;
00056 
00061         private HashMap<String, String> locations;
00062 
00063         private HashMap<String, String> objLocations; 
00064 
00068         private List<String> locationDesignators = new ArrayList<String>();
00069 
00073         private List<String> objectDesignators = new ArrayList<String>();
00074 
00079         private Map<String, String> actionLocations = null;
00080 
00081         private static CycAccess cyc = null;
00082         private static PlanExporter me = null;
00083 
00084         private CycObject kitchenEnvMt = null;
00085 
00086         String designators = new String();
00087         String goals = new String();
00088 
00089         int locCounter = 0;
00090 
00091         private PlanExporter() throws UnknownHostException, CycApiException,
00092                         IOException {
00093 
00094                 cyc = OpenCyc.getInstance().getCycAcces();
00095                 kitchenEnvMt = OpenCyc.getInstance().getKitchenEnvMt();
00096 
00097         }
00098 
00099         public static PlanExporter getInstance() throws UnknownHostException,
00100                         CycApiException, IOException {
00101 
00102                 if (me == null)
00103                         me = new PlanExporter();
00104 
00105                 return me;
00106 
00107         }
00108 
00109         public void readRplNames() {
00110                 this.rplName = new HashMap<String, String>();
00111 
00112                 
00113                 rplName.put("PuttingSomethingSomewhere", "object-at-place");
00114 
00115                 
00116                 
00117 
00118                 rplName.put("StoveTopCookingPot", "cooking-pot");
00119                 rplName.put("Water", "water");
00120                 rplName.put("CookingRange", "cooker");
00121                 rplName.put("MeasuringCup", "");
00122                 rplName.put("Tap-FlowControlDevice", "tap");
00123                 rplName.put("Burner", "hot-plate");
00124                 rplName.put("Soup", "");
00125                 rplName.put("Packet", "");
00126                 rplName.put("StoveTop", "hot-plate");
00127                 rplName.put("HeatingDevice", "hot-plate");
00128                 rplName.put("Content", "");
00129                 rplName.put("Noodle", "pasta");
00130                 rplName.put("Pasta", "pasta");
00131                 rplName.put("TableSalt", "salt");
00132                 rplName.put("Colander", "colander");
00133                 rplName.put("Chair-PieceOfFurniture", "chair");
00134                 rplName.put("Sink", "sink");
00135                 rplName.put("OliveOil", "");
00136                 rplName.put("Tea-Iced", "");
00137                 rplName.put("BakingSoda", "");
00138                 rplName.put("CookingVessel", "pan");
00139                 rplName.put("MixForBakedGoods", "pancake-mix");
00140                 rplName.put("Pancake", "pancake");
00141                 rplName.put("TeaBag", "");
00142                 rplName.put("Tea-Beverage", "");
00143                 rplName.put("ContainerArtifact", "");
00144                 rplName.put("Table-PieceOfFurniture", "table");
00145                 rplName.put("Refrigerator", "refrigerator");
00146                 rplName.put("Kettle", "cooking-pot");
00147                 rplName.put("HotBeveragePot", "cup");
00148                 rplName.put("ContainerLid", "");
00149                 rplName.put("Bottle", "");
00150                 rplName.put("Milk", "");
00151                 rplName.put("Sugar-Table", "");
00152                 rplName.put("SugarBowl", "");
00153                 rplName.put("Teaspoon", "table-spoon");
00154                 rplName.put("DrinkingMug", "cup");
00155                 rplName.put("Saucer", "plate");
00156                 rplName.put("DinnerPlate", "plate");
00157                 rplName.put("Oven", "oven");
00158                 rplName.put("Butter", "");
00159                 rplName.put("Toast", "toast");
00160                 rplName.put("Bread", "toast");
00161                 rplName.put("Bread-Slice", "toast");
00162                 rplName.put("ElectricalToaster", "toaster");
00163                 rplName.put("BreakfastCereal", "");
00164                 rplName.put("Bowl-Eating", "");
00165                 rplName.put("Spoon-SilverwarePiece", "table-spoon");
00166                 rplName.put("Fruit", "");
00167                 rplName.put("MapleSyrup", "");
00168                 rplName.put("PlaceMat", "place-mat");
00169                 rplName.put("Napkin", "napkin");
00170                 rplName.put("Fork-SilverwarePiece", "fork");
00171                 rplName.put("Knife", "knife");
00172 
00173                 
00174                 
00175 
00176                 
00177                 rplName.put("SelectingSomething", "find-object");
00178                 rplName.put("LookingForSomething", "find-object");
00179                 rplName.put("Adopting-SelectingSomething", "find-object");
00180 
00181                 
00182                 rplName.put("PuttingSomethingSomewhere", "loc");
00183                 rplName.put("TransportationEvent", "loc");
00184                 rplName.put("LiftingAnObject", "object-lifted");
00185                 rplName.put("GettingSomething-HittingAnObject", "object-in-hand");
00186 
00187                 rplName.put("TakingSomething", "object-in-hand");
00188                 rplName.put("RemovingSomething", "object-in-hand");
00189 
00190                 rplName.put("CoveringSomething", "object-on-object");
00191 
00192                 rplName.put("DoingAddition", "object-added-to-container");
00193                 rplName.put("PuttingSomethingIntoSomething", "object-added-to-container");
00194                 rplName.put("Incorporation-Physical", "object-added-to-container");
00195 
00196                 
00197                 rplName.put("TurningOnPoweredDevice", "hot-plate-temperature-on");
00198                 rplName.put("TurningOffPoweredDevice", "hot-plate-temperature-off");
00199                 rplName.put("ChangingDeviceState", "hot-plate-temperature-change");
00200 
00201                 
00202                 rplName.put("OpeningAContainer", "enclosing-object-opened");
00203                 rplName.put("ClosingAContainer", "object-closed");
00204 
00205                 
00206                 rplName.put("FillingProcess", "container-filled");
00207                 rplName.put("FluidFlow-Translation", "container-filled");
00208                 rplName.put("FluidFlow-Translation", "container-content-transfilled");
00209 
00210                 
00211                 rplName.put("Stirring", "container-content-stirred");
00212                 rplName.put("Flipping", "object-flipped");
00213 
00214                 
00215                 rplName.put("Checking-Evaluating", "sleep");
00216                 rplName.put("Observing", "sleep");
00217                 rplName.put("Waiting", "sleep");
00218                 rplName.put("KeepingInACertainState", "sleep");
00219 
00220                 rplName.put("CookingFood", "cook");
00221 
00222                 
00223                 rplName.put("CausingToBeInACertainCondition", "achieve");
00224                 rplName.put("Remembering", "achieve");
00225 
00226                 
00227                 rplName.put("UsingAnObject", "use");
00228 
00229                 
00230                 
00231                 
00232                 
00233                 
00234                 
00235                 
00236                 
00237                 
00238                 
00239                 
00240 
00241                 
00242                 
00243                 
00244                 
00245                 
00246                 
00247 
00248                 
00249                 
00250                 
00251                 
00252                 
00253                 
00254                 
00255                 
00256                 
00257 
00258         }
00259 
00260         @SuppressWarnings({ "deprecation" })
00261         public void readActionsForPlanFromKB(String plan)
00262                         throws UnknownHostException, IOException {
00263 
00264                 this.plan = new ArrayList<String>();
00265 
00266                 CycList query = cyc.makeCycList("(#$methodForAction " + plan
00267                                 + "(#$actionSequence ?LIST))");
00268                 CycVariable var = CycObjectFactory.makeCycVariable("?LIST");
00269                 CycFort mt = cyc.getConstantByName("#$TUMKitchenEnvironmentPlanningMt");
00270 
00271                 CycList ret = cyc.askWithVariable(query, var, mt);
00272 
00273                 ArrayList<String> list = new ArrayList<String>();
00274                 for (Iterator i = ret.iterator(); i.hasNext();) {
00275                         String str = i.next().toString();
00276                         list.add(str);
00277                 }
00278                 String[] actions = list.get(0).substring(9, list.get(0).length() - 1)
00279                                 .split(" ");
00280                 for (String act : actions) {
00281                         this.plan.add(act);
00282                 }
00283         }
00284 
00285         public void readActionTypesFromKB() throws UnknownHostException,
00286                         IOException {
00287 
00288                 
00289                 actionTypes = new HashMap<String, String>();
00290                 for (String action : this.plan) {
00291                         actionTypes.put(action, cyc.getMinIsas(
00292                                         cyc.getConstantByName(action), kitchenEnvMt).toString());
00293                 }
00294 
00295         }
00296 
00297         public void readActionParametersFromKB(ArrayList<String> actionList)
00298                         throws UnknownHostException, IOException {
00299 
00300                 actionParameters = new HashMap<String, CycList>();
00301 
00302                 
00303                 for (String action : actionList) {
00304                         actionParameters.put(action, arg1GAFsAbout(action,
00305                                         MT_TUM_KITCHEN_ENVIRONMENT));
00306                 }
00307         }
00308 
00309         public void readObjectsFromKB(HashMap<String, CycList> paramList)
00310                         throws UnknownHostException, IOException {
00311                 objects = new HashMap<String, CycList>();
00312 
00313                 
00314                 for (String key : paramList.keySet()) {
00315 
00316                         CycList curParamList = paramList.get(key);
00317 
00318                         for (Iterator i = curParamList.iterator(); i.hasNext();) {
00319                                 String curParam = i.next().toString();
00320                                 if ((curParam.contains("objectActedOn"))
00321                                                 || (curParam.contains("objectMoving"))
00322                                                 || (curParam.contains("objectOfStateChange"))) {
00323 
00324                                         String objectName = curParam.substring(1,
00325                                                         curParam.length() - 1).split(" ")[1];
00326                                         objects.put(objectName.trim(), arg1GAFsAbout(objectName,
00327                                                         MT_TUM_KITCHEN_ENVIRONMENT));
00328                                 }
00329                         }
00330 
00331                 }
00332 
00333         }
00334 
00335         public void readLocationsFromKB(HashMap<String, CycList> paramList)
00336                         throws UnknownHostException, IOException {
00337                 locations = new HashMap<String, String>();
00338                 actionLocations = new HashMap<String, String>();
00339 
00340                 locCounter = 0;
00341 
00342                 
00343                 for (String action : paramList.keySet()) {
00344 
00345                         CycList curParamList = paramList.get(action);
00346 
00347                         for (Iterator i = curParamList.iterator(); i.hasNext();) {
00348                                 String curParam = i.next().toString();
00349                                 if (curParam.contains("purposeOf-Generic")) {
00350 
00351                                         String locName = "location" + locCounter++;
00352                                         locations.put(locName, curParam);
00353                                         actionLocations.put(action, locName);
00354                                 }
00355                         }
00356                 }
00357         }
00358 
00359         @SuppressWarnings({ "deprecation" })
00360         public CycList arg1GAFsAbout(String concept, String microtheory)
00361                         throws UnknownHostException, IOException {
00362 
00363                 CycObject mt = cyc.getConstantByName(microtheory);
00364                 CycList query = cyc.makeCycList("(?PRED #$" + concept + " ?ARG)");
00365 
00366                 CycVariable pred = CycObjectFactory.makeCycVariable("?PRED");
00367                 CycVariable arg = CycObjectFactory.makeCycVariable("?ARG");
00368                 ArrayList<CycVariable> vars = new ArrayList<CycVariable>();
00369                 vars.add(pred);
00370                 vars.add(arg);
00371 
00372                 CycList l = cyc.askWithVariables(query, vars, mt);
00373                 return l;
00374         }
00375 
00376         @SuppressWarnings({ "deprecation" })
00377         public CycList arg2GAFsAbout(String concept, String microtheory)
00378                         throws UnknownHostException, IOException {
00379 
00380                 CycObject mt = cyc.getConstantByName(microtheory);
00381                 CycList query = cyc.makeCycList("(?PRED ?ARG #$" + concept + ")");
00382 
00383                 CycVariable pred = CycObjectFactory.makeCycVariable("?PRED");
00384                 CycVariable arg = CycObjectFactory.makeCycVariable("?ARG");
00385                 ArrayList<CycVariable> vars = new ArrayList<CycVariable>();
00386                 vars.add(pred);
00387                 vars.add(arg);
00388 
00389                 return cyc.askWithVariables(query, vars, mt);
00390         }
00391 
00392         public String exportPlanToRPL(String planName) {
00393                 String res = "";
00394                 
00395                 if(actionLocations!=null)
00396                         actionLocations.clear();
00397                 
00398                 if(actionParameters!=null)
00399                         actionParameters.clear();
00400                 if(actionTypes!=null)
00401                         actionTypes.clear();
00402                 if(locationDesignators!=null)
00403                         locationDesignators.clear();
00404                 if(locations!=null)
00405                         locations.clear();
00406                 if(objectDesignators!=null)
00407                         objectDesignators.clear();
00408                 if(objects!=null)               
00409                         objects.clear();
00410                 if(objLocations!=null)
00411                         objLocations.clear();
00412                 
00413                 goals="";
00414                 designators="";
00415                 
00416                 try {
00417 
00418                         
00419                         readRplNames();
00420 
00421                         
00422                         readActionsForPlanFromKB(planName);
00423 
00424                         
00425                         readActionParametersFromKB(this.plan);
00426 
00427                         
00428                         readActionTypesFromKB();
00429 
00430                         
00431                         readObjectsFromKB(this.actionParameters);
00432                         readLocationsFromKB(this.actionParameters);
00433 
00434                         
00435                         readObjectDesignators(this.objects);
00436 
00437                         
00438                         readLocationDesignators(this.locations);
00439 
00440                         
00441                         for (String objDesig : objectDesignators)
00442                                 designators += "         " + objDesig + "\n";
00443 
00444                         
00445                         for (String locDesig : locationDesignators)
00446                                 designators += "         " + locDesig + "\n";
00447 
00448                         
00449 
00450                         for (String act : plan) {
00451 
00452                                 String actType = actionTypes.get(act);
00453                                 actType = actType.substring(1, actType.length() - 1);
00454                                 String rplAction = rplName.get(actType);
00455                                 if (rplAction == null) {
00456                                         continue;
00457                                 }
00458                                 if (rplAction.equals("find-entity")) {
00459                                         goals += readFindObject(act);
00460                                 }
00461 
00462                                 else if (rplAction.equals("loc")) {
00463                                         goals += readObjectAtPlace(act);
00464                                 }
00465 
00466                                 else if (rplAction.equals("object-in-hand")) {
00467                                         goals += readObjectPickedUp(act);
00468                                 }
00469 
00470                                 else if (rplAction.equals("object-on-object")) {
00471                                         goals += readObjectOnObject(act);
00472                                 }
00473 
00474                                 else if (rplAction.equals("object-added-to-container")) {
00475                                         goals += readObjectAddedToContainer(act);
00476                                 }
00477 
00478                                 else if (rplAction.matches("hot-plate-temperature")) {
00479                                         goals += readHotPlateTemperature(act);
00480                                 }
00481 
00482                                 else if (rplAction.equals("enclosing-object-opened")) {
00483                                         goals += readEnclosingObjectOpened(act);
00484                                 }
00485 
00486                                 else if (rplAction.equals("object-flipped")) {
00487                                         goals += readObjectFlipped(act);
00488                                 }
00489 
00490                                 else if (rplAction.equals("object-closed")) {
00491                                         goals += readObjectClosed(act);
00492                                 }
00493 
00494                                 else if (rplAction.equals("container-filled")) {
00495                                         goals += readContainerFilled(act);
00496                                 }
00497 
00498                                 else if (rplAction.equals("container-content-transfilled")) {
00499                                         goals += readContainerContentTransfilled(act);
00500                                 }
00501 
00502                                 else if (rplAction.equals("container-content-stirred")) {
00503                                         goals += readContainerContentStirred(act);
00504                                 }
00505 
00506                                 else if (rplAction.equals("sleep")) {
00507                                         goals += readWait(act);
00508                                 }
00509 
00510                                 else if (rplAction.equals("cook")) {
00511                                         goals += readCook(act);
00512                                 }
00513 
00514                                 else if (rplAction.equals("achieve")) {
00515                                         goals += readAchieve(act);
00516                                 }
00517 
00518                                 else if (rplAction.equals("use")) {
00519                                         goals += readUse(act);
00520                                 }
00521 
00522                                 else {
00523                                         goals += "";
00524                                 }
00525                         }
00526 
00527                         
00528                         res += "(def-top-level-plan ehow-"
00529                                         + planName.substring(3, planName.length() - 1).split(" ")[0]
00530                                                         .replaceAll("_", "-") + " ()"
00531                                         + "\n" + "  (with-designators (\n";
00532 
00533                         res += designators;
00534                         res += ")\n";
00535 
00536                         res += goals;
00537 
00538                         res += ")))";
00539 
00540                 
00541 
00542                 } catch (UnknownHostException e) {
00543                         e.printStackTrace();
00544                 } catch (CycApiException e) {
00545                         e.printStackTrace();
00546                 } catch (IOException e) {
00547                         e.printStackTrace();
00548                 }
00549 
00550                 return res;
00551         }
00552 
00553         private void readObjectDesignators(HashMap<String, CycList> objects) {
00554 
00555                 
00556                 for (String obj : objects.keySet()) {
00557 
00558                         String object = "";
00559 
00560                         object += "(" + obj + " (object ";
00561 
00562                         
00563                         HashMap<String, String> objparams = cycParamListToStringMap(objects
00564                                         .get(obj));
00565                         for (String par : objparams.keySet()) {
00566                                 String val = objparams.get(par);
00567 
00568                                 
00569                                 
00570                                 if (par.equals("isa")) {
00571                                         object += "'((type " + rplName.get(val)
00572                                                         + "))";
00573                                 } else if (par.equals("name")) {
00574                                         object += " (name " + rplName.get(val) + ")";
00575                                 } else if (par.equals("matches")) {
00576                                         object += " (matches " + rplName.get(val)
00577                                                         + ")";
00578                                 } else if (par.equals("matches-internal")) {
00579                                         object += " (matches-internal "
00580                                                         + rplName.get(val) + ")";
00581                                 } else if (par.equals("referenced-by")) {
00582                                         object += " (referenced-by "
00583                                                         + rplName.get(val) + ")";
00584                                 } else if (par.equals("properPhysicalParts")) {
00585                                         object += " (part-of " + rplName.get(val)
00586                                                         + ")";
00587                                 } else if (par.equals("containsPart")) {
00588                                         object += "\n              (parent-of " + rplName.get(val)
00589                                                         + ")";
00590                                 } else if (par.equals("regulating-temperature")) {
00591                                         object += "\n              (regulating-temperature "
00592                                                         + rplName.get(val) + ")";
00593                                 } else if (par.equals("regulating-water-flow")) {
00594                                         object += "\n              (regulating-water-flow "
00595                                                         + rplName.get(val) + ")";
00596                                 } else if (par.equals("fitting")) {
00597                                         object += "\n              (fitting " + rplName.get(val)
00598                                                         + ")";
00599                                 } else if (par.equals("status")) {
00600                                         object += "\n              (status " + rplName.get(val)
00601                                                         + ")";
00602                                 } else if (par.equals("exclude")) {
00603                                         object += "\n              (exclude " + rplName.get(val)
00604                                                         + ")";
00605                                 }
00606                         }
00607                         object += "))";
00608 
00609                         objectDesignators.add(object);
00610                 }
00611         }
00612 
00613         private void readLocationDesignators(HashMap<String, String> locations)
00614                         throws UnknownHostException, IOException {
00615 
00616                 this.objLocations = new HashMap<String, String>();
00617 
00618                 for (String action : plan) {
00619 
00620                         String loc = actionLocations.get(action);
00621 
00622                         if (loc == null)
00623                                 continue;
00624 
00625                         
00626                         String locExpr = locations.get(loc);
00627 
00628                         String preposition = locExpr.substring(20, locExpr.length() - 2)
00629                                         .split(" ")[0];
00630                         String forObject = locExpr.substring(20, locExpr.length() - 2)
00631                                         .split(" ")[1];
00632                         String locDesc = locExpr.substring(20, locExpr.length() - 2).split(
00633                                         " ")[2];
00634                         String locationDesignator = "";
00635 
00636                         
00637                         locationDesignator += "(" + loc + " ";
00638 
00639                         if (preposition.equals("nextToLikeObjects")) {
00640                                 locationDesignator += "(location `((next-to ,"
00641                                                 + constructLocDesignatorFromCycString(locDesc, action)
00642                                                 + ") (for ," + forObject + ")))";
00643 
00644                                 this.objLocations.put(forObject, loc);
00645 
00646                         } else if ((preposition.equals("in-UnderspecifiedContainer"))||(preposition.equals("into-UnderspecifiedContainer"))) {
00647 
00648                                 locationDesignator += "(location `((in ,"
00649                                                 + constructLocDesignatorFromCycString(locDesc, action)
00650                                                 + ") (of ," + forObject + ")))";
00651                                 this.objLocations.put(forObject, loc);
00652 
00653                         } else if (preposition.equals("from-UnderspecifiedLocation")) {
00654 
00655                                 locationDesignator += "(location `((in ,"
00656                                                 + constructLocDesignatorFromCycString(locDesc, action)
00657                                                 + ") (of ," + forObject + ")))";
00658                                 this.objLocations.put(forObject, loc);
00659 
00660                         } else if (preposition.equals("to-UnderspecifiedLocation")) {
00661                                 System.out.println(locDesc);
00662                                 locationDesignator += "(location `((in ,"
00663                                                 + constructLocDesignatorFromCycString(locDesc, action)
00664                                                 + ") (for ," + forObject + ")))";
00665                                 this.objLocations.put(forObject, loc);
00666 
00667                         } else if (preposition.equals("on-UnderspecifiedSurface")) {
00668 
00669                                 locationDesignator += "(location `((on ,"
00670                                                 + constructLocDesignatorFromCycString(locDesc, action)
00671                                                 + ") (for ," + forObject + ")))";
00672                                 this.objLocations.put(forObject, loc);
00673 
00674                         } else {
00675                                 locationDesignator += "(location `((on ,"
00676                                                 + constructLocDesignatorFromCycString(locDesc, action)
00677                                                 + ") (for ," + forObject + ")))";
00678                                 this.objLocations.put(forObject, loc);
00679                         }
00680                         locationDesignator += ")";
00681 
00682                         locationDesignators.add(locationDesignator);
00683 
00684                 }
00685         }
00686 
00687         private String constructLocDesignatorFromCycString(String locDesc,
00688                         String action) throws UnknownHostException, IOException {
00689 
00690                 
00691                 
00692                 
00693                 
00694                 
00695                 
00696                 CycList tmpList = arg2GAFsAbout(locDesc, MT_TUM_KITCHEN_ENVIRONMENT);
00697                 HashMap<String, String> locparams = cycParamListToStringMap(tmpList);
00698 
00699                 if (locparams.isEmpty()) {
00700                         
00701                         
00702                         String locDescType = cyc.getMinIsas(cyc.getConstantByName(locDesc),
00703                                         kitchenEnvMt).toString();
00704                         locDescType = locDescType.substring(1, locDescType.length() - 1);
00705 
00706                         if (containsString(spatialRelations, locDescType)) {
00707                                 String prevLocation = getObjectLocationOfPreviousAction(action);
00708                                 String locExpr = locations.get(prevLocation);
00709 
00710 
00711 
00712 
00713 
00714                                 String locDesc2 = locExpr.substring(20, locExpr.length() - 2)
00715                                                 .split(" ")[2];
00716                                 return constructLocDesignatorFromCycString(locDesc2, getPreviousAction(action));
00717                         }
00718                         
00719                         
00720                         if(!getAllObjectIds().contains(locDesc)) {
00721                                 
00722                                 String objType = cyc.getMinIsas(cyc.getConstantByName(locDesc), kitchenEnvMt).toString();
00723                                 objType = objType.replace((CharSequence) "(", ""); 
00724                                 objType = objType.replace((CharSequence) ")", "");
00725                                 objType = objType.split(" ")[0];
00726                 
00727                                 objectDesignators.add("(" + locDesc + " (object '((type " + rplName.get(objType) + "))))");
00728                         }
00729 
00730                         return locDesc;
00731                 } else {
00732                         String locDescType = cyc.getMinIsas(cyc.getConstantByName(locDesc),
00733                                         kitchenEnvMt).toString();
00734                         locDescType = locDescType.substring(1, locDescType.length() - 1);
00735                         String[] types = locDescType.split(" ");
00736 
00737                         
00738                         
00739                         
00740 
00741                         if (containsString(types, "CornerOnObject")) {
00742 
00743                                 String location = "on-";
00744 
00745                                 if (containsString(types, "TopSide"))
00746                                         location += "back";
00747                                 else if (containsString(types, "BottomSide"))
00748                                         location += "front";
00749                                 if (containsString(types, "LeftSide"))
00750                                         location += "-left";
00751                                 else if (containsString(types, "RightSide"))
00752                                         location += "-right";
00753 
00754                                 String locDesignator = constructLocDesignatorFromCycString(
00755                                                 locparams.get("parts-Underspecified"), action);
00756 
00757                                 if (locDesignator.split(" ").length > 1) {
00758                                         
00759                                         String locId = "location" + this.locCounter++;
00760                                         locationDesignators.add("(" + locId + " `(a location "
00761                                                         + locDesignator + "))");
00762                                         return "(" + location + " ," + locId + ")";
00763                                 } else
00764                                         return "(" + location + " ," + locDesignator + ")";
00765 
00766                         } else if (types[0].equals("LeftSide")) {
00767                                 String locDesignator = constructLocDesignatorFromCycString(
00768                                                 locparams.get("parts-Underspecified"), action);
00769                                 if (locDesignator.split(" ").length > 1) {
00770                                         
00771                                         String locId = "location" + this.locCounter++;
00772                                         locationDesignators.add("(" + locId + " `(a location "
00773                                                         + locDesignator + "))");
00774                                         return "(left-of ," + locId + ")";
00775                                 } else
00776                                         return "(left-of ," + locDesignator + ")";
00777 
00778                         } else if (types[0].equals("RightSide")) {
00779                                 String locDesignator = constructLocDesignatorFromCycString(
00780                                                 locparams.get("parts-Underspecified"), action);
00781                                 if (locDesignator.split(" ").length > 1) {
00782                                         
00783                                         String locId = "location" + this.locCounter++;
00784                                         locationDesignators.add("(" + locId + " `(a location "
00785                                                         + locDesignator + "))");
00786                                         return "(right-of ," + locId + ")";
00787                                 } else
00788                                         return "(right-of ," + locDesignator + ")";
00789 
00790                         } else if (types[0].equals("CenterOfGeographicalRegion")) {
00791                                 String locDesignator = constructLocDesignatorFromCycString(
00792                                                 locparams.get("parts-Underspecified"), action);
00793                                 if (locDesignator.split(" ").length > 1) {
00794                                         
00795                                         String locId = "location" + this.locCounter++;
00796                                         locationDesignators.add("(" + locId + " `(a location "
00797                                                         + locDesignator + "))");
00798                                         return "(on-center ," + locId + ")";
00799                                 } else
00800                                         return "(on-center ," + locDesignator + ")";
00801 
00802                         } else if (types[0].equals("Side")) {
00803                                 String locDesignator = constructLocDesignatorFromCycString(
00804                                                 locparams.get("parts-Underspecified"), action);
00805                                 if (locDesignator.split(" ").length > 1) {
00806                                         
00807                                         String locId = "location" + this.locCounter++;
00808                                         locationDesignators.add("(" + locId + " `(a location "
00809                                                         + locDesignator + "))");
00810                                         return "(next-to ," + locId + ")";
00811                                 } else
00812                                         return "(next-to ," + locDesignator + ")";
00813 
00814                         } else if (types[0].equals("FrontSide")) {
00815                                 String locDesignator = constructLocDesignatorFromCycString(
00816                                                 locparams.get("parts-Underspecified"), action);
00817                                 if (locDesignator.split(" ").length > 1) {
00818                                         
00819                                         String locId = "location" + this.locCounter++;
00820                                         locationDesignators.add("(" + locId + " `(a location "
00821                                                         + locDesignator + "))");
00822                                         return "(on-front ," + locId + ")";
00823                                 } else
00824                                         return "(on-front ," + locDesignator + ")";
00825 
00826                         } else {
00827                                 return locDesc;
00828                         }
00829                 }
00830                 
00831         }
00832 
00840         private void getInvolvedEntities(String id, List<String> entities) {
00841 
00842                 if (actionParameters.get(id) != null) {
00843                         
00844                         HashMap<String, String> params = cycParamListToStringMap(actionParameters
00845                                         .get(id));
00846                         entities.add(params.get("objectActedOn"));
00847 
00848                         getInvolvedEntities(objLocations.get(params.get("objectActedOn")),
00849                                         entities);
00850 
00851                 } else if (getAllLocationIds().contains(id)) {
00852                         
00853 
00854                         for (String locDesig : locationDesignators) {
00855                                 if (id.equals(locDesig.substring(1, locDesig.indexOf(" ")))) {
00856                                         for (String obj : getAllObjectIds()) {
00857                                                 if (locDesig.contains(obj) && !entities.contains(obj))
00858                                                         entities.add(obj);
00859                                         }
00860                                         for (String loc : getAllLocationIds()) {
00861                                                 if (locDesig.indexOf(loc) > 1) {
00862                                                         getInvolvedEntities(loc, entities);
00863                                                 }
00864                                         }
00865                                 }
00866                         }
00867 
00868                 }
00869 
00870         }
00871 
00872         private List<String> getAllObjectIds() {
00873                 List<String> ids = new ArrayList<String>();
00874 
00875                 for (String objDesig : objectDesignators) {
00876                         String objId = objDesig.substring(1, objDesig.indexOf(" "));
00877                         ids.add(objId);
00878                 }
00879                 return ids;
00880         }
00881 
00882         private List<String> getAllLocationIds() {
00883                 List<String> ids = new ArrayList<String>();
00884 
00885                 for (String locDesig : locationDesignators) {
00886                         String locId = locDesig.substring(1, locDesig.indexOf(" "));
00887                         ids.add(locId);
00888                 }
00889                 return ids;
00890         }
00891 
00892         private String makePerceiveForEntities(List<String> entities) {
00893                 String str = "";
00894 
00895                 for (String e : entities)
00896                         str += "(perceive " + e + ")\n";
00897 
00898                 return str;
00899         }
00900 
00901         private String getPreviousAction(String action) {
00902                 for (int i = 0; i < plan.size(); i++) {
00903 
00904                         if (i > 0 && action.equals(plan.get(i)))
00905                                 return plan.get(i - 1);
00906                 }
00907                 return null;
00908         }
00909 
00910         private String getObjectLocationOfPreviousAction(String action) {
00911                 for (int i = 0; i < plan.size(); i++) {
00912 
00913                         String loc = actionLocations.get(plan.get(i));
00914 
00915                         if (loc != null && action.equals(plan.get(i)) && i > 0)
00916                                 return actionLocations.get(plan.get(i - 1));
00917                 }
00918                 return null;
00919         }
00920 
00921         @SuppressWarnings("unused")
00922         private String getObjectLocationForAction(String action) {
00923                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
00924                                 .get(action));
00925                 return objLocations.get(params.get("objectActedOn").trim());
00926         }
00927 
00928         
00929         
00930         private String readObjectAtPlace(String action) {
00931 
00932                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
00933                                 .get(action));
00934 
00935                 List<String> entities = new ArrayList<String>();
00936                 getInvolvedEntities(action, entities);
00937 
00938                 
00939                 return "(perceive " + params.get("objectActedOn") + ")\n"
00940                                 + "(achieve `(loc ," + params.get("objectActedOn") + " ," 
00941                                 + objLocations.get(params.get("objectActedOn").trim()) + "))\n";
00942         }
00943 
00944         private String readFindObject(String action) {
00945 
00946                 
00947                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
00948                                 .get(action));
00949 
00950                 
00951                 return "(achieve (findEntity\n" + "      "
00952                                 + params.get("objectActedOn") + "))\n";
00953         }
00954 
00955         private String readObjectPickedUp(String action) {
00956 
00957                 
00958                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
00959                                 .get(action));
00960                 
00961                 List<String> entities = new ArrayList<String>();
00962                 getInvolvedEntities(action, entities);
00963                 
00964                 return  "(perceive " + params.get("objectActedOn") + ")\n"
00965                                 + "(achieve `(object-in-hand ," 
00966                                 + params.get("objectActedOn") + "))\n";
00967 
00968         }
00969 
00970         private String readObjectOnObject(String action) {
00971 
00972                 
00973                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
00974                                 .get(action));
00975 
00976                 try {
00977                         if (cyc.getMinIsas(
00978                                         cyc.getConstantByName(params.get("objectActedOn")),
00979                                         kitchenEnvMt).toString().matches("StoveTopCookingPot")) {
00980 
00981                                 
00982                                 
00983                                 this.designators += "(lid1 `(an entity" + "     (type lid)))";
00984                                 return "(achieve (object-on-entity lid1 "
00985                                                 + params.get("objectActedOn") + "))\n";
00986 
00987                         }
00988                 } catch (Exception e) {
00989                 }
00990 
00991                 return "(achieve (object-on-entity))\n";
00992         }
00993 
00994         private String readObjectAddedToContainer(String action) { 
00995                 
00996                 
00997                 
00998                 
00999 
01000                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01001                                 .get(action));
01002 
01003                 return "(achieve (object-added-to-container "
01004                                 + params.get("objectActedOn") + "))\n";
01005         }
01006 
01007         private String readHotPlateTemperature(String action) {
01008 
01009                 
01010                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01011                                 .get(action));
01012 
01013                 if (action.equals("hot-plate-temperature-on")) {
01014 
01015                         return "(achieve (hot-plate-temperature\n" + "      "
01016                                         + params.get("objectActedOn") + "\n" + " :on))\n";
01017 
01018                 } else if (action.equals("hot-plate-temperature-off")) {
01019 
01020                         return "(achieve (hot-plate-temperature\n" + "      "
01021                                         + params.get("objectActedOn") + "\n" + " :off))\n";
01022 
01023                 } else {
01024                         
01025                         return "(achieve (hot-plate-temperature\n" + "      "
01026                                         + params.get("objectActedOn") + "\n" + " :off))\n";
01027                 }
01028 
01029         }
01030 
01031         private String readEnclosingObjectOpened(String action) {
01032 
01033                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01034                                 .get(action));
01035                 return "(achieve (enclosing-object-opened\n" + "      "
01036                                 + params.get("objectActedOn") + "))\n";
01037 
01038         }
01039 
01040         private String readObjectFlipped(String action) {
01041 
01042                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01043                                 .get(action));
01044                 
01045                 List<String> entities = new ArrayList<String>();
01046                 getInvolvedEntities(action, entities);
01047                 return "(perceive " + params.get("objectActedOn") + ")\n" + 
01048                                 "(achieve `(object-flipped ,"
01049                                 + params.get("objectActedOn") + "))\n";
01050 
01051         }
01052         
01053         private String readObjectClosed(String action) {
01054 
01055                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01056                                 .get(action));
01057                 return "(achieve (object-closed\n" + "      "
01058                                 + params.get("objectActedOn") + "))\n";
01059         }
01060 
01061         private String readContainerFilled(String action) {
01062 
01063                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01064                                 .get(action));
01065                 
01066                 
01067 
01068                 
01069                 String stuff = params.get("purposeOf-Generic");
01070                 if (stuff != null && stuff.matches(".*with-Underspecified.*")) {
01071                         stuff = stuff.substring(28, stuff.length() - 2).split(" ")[1];
01072                 }
01073 
01074                 return "(achieve (container-filled\n" + "      "
01075                                 + params.get("objectActedOn") + "\n" + "      :" + stuff
01076                                 + " 1.0l))\n"; 
01077 
01078                 
01079                 
01080         }
01081 
01082         private String readContainerContentTransfilled(String action) { 
01083 
01084                 
01085                 HashMap<String, String> params = cycParamListToStringMap(actionParameters.get(action));
01086 
01087                 
01088                 String stuff = params.get("purposeOf-Generic");
01089                 String cont="";
01090                 if (stuff != null && stuff.matches(".*into-UnderspecifiedContainer.*")) {
01091                         cont  = stuff.substring(30, stuff.length() - 1).split(" ")[1];
01092                         stuff = stuff.substring(30, stuff.length() - 1).split(" ")[0];
01093                 }
01094                 
01095                 List<String> entities = new ArrayList<String>();
01096                 getInvolvedEntities(action, entities);
01097                 return "(perceive " + stuff + ")\n" + "(perceive " + cont + ")\n" +
01098                            "(achieve `(container-content-transfilled ,"+stuff+" ,"+cont+"))\n"; 
01099 
01100         }
01101 
01102         private String readContainerContentStirred(String action) { 
01103 
01104                 
01105                 
01106                 
01107 
01108                 
01109                 
01110                 
01111                 
01112                 
01113 
01114                 
01115                 
01116                 
01117                 
01118 
01119                 
01120                 
01121                 return "(achieve (container-content-stirred))\n";
01122         }
01123 
01124         private String readWait(String action) {
01125 
01126                 
01127                 HashMap<String, String> params = cycParamListToStringMap(actionParameters
01128                                 .get(action));
01129 
01130                 String timespan = params.get("timeSpan");
01131 
01132                 String[] unit_value = { "" };
01133                 if (timespan != null)
01134                         unit_value = timespan.substring(1, timespan.length() - 1)
01135                                         .split(" ");
01136 
01137                 int time=0;
01138                 if (unit_value.length == 2) {
01139 
01140                         
01141                         if (unit_value[1].matches("[0-9.]*")) { 
01142                                 
01143                                 time = Integer.valueOf(unit_value[1]);
01144                         } else if (unit_value[1].equals("#$Few-Quant")) {
01145                                 time = 2;
01146                         }
01147 
01148                         
01149                         if (unit_value[0].equals("MinutesDuration")) {
01150                                 time *= 60;
01151                         } else if (unit_value[0].equals("HoursDuration")) {
01152                                 time *= 3600;
01153                         }
01154 
01155                 }
01156 
01157                 return "(sleep " + time + ")\n";
01158         }
01159 
01160         private String readCook(String action) { 
01161 
01162                 
01163                 
01164                 
01165 
01166                 return "(achieve (cook))\n";
01167         }
01168 
01169         private String readAchieve(String action) { 
01170 
01171                 
01172                 
01173                 
01174 
01175                 
01176                 return "(achieve ())\n";
01177         }
01178 
01179         private String readUse(String action) { 
01180 
01181                 
01182                 
01183                 
01184 
01185                 
01186                 
01187 
01188                 return "(achieve (container-content-transfilled))\n";
01189         }
01190 
01191         
01192         private HashMap<String, String> cycParamListToStringMap(CycList cycPar) {
01193                 HashMap<String, String> res = new HashMap<String, String>();
01194 
01195                 for (Iterator i = cycPar.iterator(); i.hasNext();) {
01196                         String curParam = i.next().toString();
01197 
01198                         String[] key_val = curParam.substring(1, curParam.length() - 1)
01199                                         .split(" ");
01200 
01201                         String key = key_val[0];
01202                         String val = "";
01203                         for (int j = 1; j < key_val.length; j++) {
01204                                 if (j > 1)
01205                                         val += " ";
01206                                 val += key_val[j];
01207                         }
01208                         res.put(key, val);
01209 
01210                 }
01211 
01212                 return res;
01213         }
01214 
01215         private boolean containsString(String[] list, String str) {
01216                 for (String s : list)
01217                         if (s.equals(str))
01218                                 return true;
01219                 return false;
01220         }
01221 
01222 }