* @param mt the microtheory in which the query is asked
   *
   * @return a list of bindings for the query
   *
   * @throws UnknownHostException if cyc server host not found on the network
   * @throws IOException if a data communication error occurs
   * @throws CycApiException if the api request results in a cyc server error
   */
  public CycList askWithVariables(CycList query,
          List variables,
          CycObject mt)
          throws UnknownHostException, IOException, CycApiException {
    StringBuilder queryBuffer = new StringBuilder();
    queryBuffer.append("(clet ((*cache-inference-results* nil) ");
    queryBuffer.append("       (*compute-inference-results* nil) ");
    queryBuffer.append("       (*unique-inference-result-bindings* t) ");
    queryBuffer.append("       (*generate-readable-fi-results* nil)) ");
    queryBuffer.append("  (without-wff-semantics ");
    queryBuffer.append("    (ask-template ").append((new CycList(variables)).stringApiValue()).append(" ");
    queryBuffer.append("                  ").append(query.stringApiValue()).append(" ");
    queryBuffer.append("                  ").append(mt.stringApiValue()).append(" ");
    queryBuffer.append("                  0 nil nil nil)))");

    CycList bindings = converseList(queryBuffer.toString());
    CycList canonicalBindings = new CycList();
    Iterator iter = bindings.iterator();

    while (iter.hasNext()) {
      canonicalBindings.add(this.canonicalizeList((CycList) iter.next()));
    }
    return canonicalBindings;
  }