private static Pddl buildShakeysWorldPddl() {
    // Initial static state of Shakey's World.
    List<Proposition> initialState = new ArrayList<Proposition>();
    // Goal static state of Shakey's World.
    List<Proposition> goalState = new ArrayList<Proposition>();

    // Set up room & location states.
    for (int roomNum = 1; roomNum <= 4; roomNum++) {
      // Rooms.
      initialState.add(RoomProposition.initRoomProposition("Room" + roomNum));
      goalState.add(RoomProposition.initRoomProposition("Room" + roomNum));
      // Locations.
      initialState.add(LocationProposition.initLocationProposition("Room" + roomNum));
      goalState.add(LocationProposition.initLocationProposition("Room" + roomNum));
      initialState.add(LocationProposition.initLocationProposition("Door" + roomNum));
      goalState.add(LocationProposition.initLocationProposition("Door" + roomNum));
      initialState.add(LocationProposition.initLocationProposition("Switch" + roomNum));
      goalState.add(LocationProposition.initLocationProposition("Switch" + roomNum));
      // Room space also in room.
      initialState.add(InProposition.initInProposition("Room" + roomNum, "Room" + roomNum));
      goalState.add(InProposition.initInProposition("Room" + roomNum, "Room" + roomNum));
      // One switch in each room.
      initialState.add(InProposition.initInProposition("Switch" + roomNum, "Room" + roomNum));
      goalState.add(InProposition.initInProposition("Switch" + roomNum, "Room" + roomNum));
      // One door in each room.
      initialState.add(InProposition.initInProposition("Door" + roomNum, "Room" + roomNum));
      goalState.add(InProposition.initInProposition("Door" + roomNum, "Room" + roomNum));
      // Same door in corridor.
      initialState.add(InProposition.initInProposition("Door" + roomNum, "Corridor"));
      goalState.add(InProposition.initInProposition("Door" + roomNum, "Corridor"));
    }

    // Set up box states.
    for (int boxNum = 1; boxNum <= 4; boxNum++) {
      // Locations.
      initialState.add(BoxProposition.initBoxProposition("Box" + boxNum));
      goalState.add(BoxProposition.initBoxProposition("Box" + boxNum));
      // Four boxes in room #1, initial state. Box #2 in room #2 goal state.
      initialState.add(AtProposition.initAtProposition("Box" + boxNum, "Room1"));
      // Four boxes in room #1, box #2 in room #2 goal state.
      if (boxNum != 2) {
        goalState.add(AtProposition.initAtProposition("Box" + boxNum, "Room1"));
      } else {
        goalState.add(AtProposition.initAtProposition("Box" + boxNum, "Room" + boxNum));
      }
    }

    // Corridor is location.
    initialState.add(RoomProposition.initRoomProposition("Corridor"));
    goalState.add(RoomProposition.initRoomProposition("Corridor"));

    // Shakey's initial location.
    initialState.add(AtProposition.initAtProposition("Shakey", "Room3"));

    // Shakey's goal location.
    goalState.add(AtProposition.initAtProposition("Shakey", "Room2"));

    // Actions.
    List<Action> actions = new ArrayList<Action>();
    actions.add(GoAction.initGoAction());
    actions.add(PushAction.initPushAction());

    return new ShakeysWorldPddl(initialState, goalState, actions);
  }