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 }