//
// KEHOME/java/cyc/mycyc.java
// Oct/22/2005

// adapted from KEHOME/java/tap/mytap.java

// usage:
//	java mycyc myworld mycontext
//	verb (predicate subject object)
//	...
//	CONTROL-Z
//
// example:
//	java mycyc dick BaseKB
//	at (space view time)
//	query (isa Person ?x)
//	query (subClassOf ?x Person)
//	assert (isa DickMcCullough Person)
//	do (cyc-create "DickMcCullough" nil)
//	do (write-image "world/dick")
//	do (generate-phrase expression)
//	do (exit)
//	CONTROL-Z

import java.io.*;
import java.util.*;
import java.util.regex.*;

//import org.opencyc.cycagent;
//import org.opencyc.cycobject.CycList;
//import org.opencyc.cycobject.*;
//import org.opencyc.xml;
//import org.opencyc.inferencesupport.*;
//import org.opencyc.api;

/**
*	assumes OpenCyc server is already running
*
*	read Cyc KB world,context from command line
*	read sentence(s) from standard input
*	parse to cycline
*	write cycline to OpenCyc server
*	read answer(s) from OpenCyc server
*	sort answer(s)
*	print answer(s)
*/
public class mycyc
{
    public static void main(String argv[])
    //----------------------------------//
    throws IOException
    {
	String info      = "# INFO: cyc: ";
	String error     = "# ERROR: cyc: ";
	String warning   = "# WARNING: cyc: ";
	String debug     = "no";

	//String myworld = System.getProperty("MYWORLD");
	//String mycontext = System.getProperty("MYCONTEXT");
	int argc = argv.length;
	if (argc > 0) {
		String myworld = argv[0];
	}
	if (argc > 1) {
		String mycontext = argv[1];
		String s_context = " " + mkr2cyc.cyclify(mycontext) +")";
	} else {
		String s_context = " #$BaseKB)";
	}

	//GenericAgent cyc = new GenericAgent(myworld);

	String p_assert = "(CYC-ASSERT '";
	String p_query = "(CYC-QUERY '";

	BufferedReader in = new BufferedReader(
		new InputStreamReader(System.in));
	String line = "";
for (
	int linenumber = 0;
	line != null;
	++linenumber
) {
	System.err.print("cyc$ ");
	try {
		line = in.readLine();
	} catch(IOException e) {
		return;
	}
	if (line == null) return;
	if (line.length() == 0) continue;
	if (debug == "yes") {
	  System.err.println(info + "line = " + line);
	}
	/**
	* parse to quad: verb (predicate subject object)
	* any "left-over" words belong to object
	*/
	String[] sentence = Pattern.compile("() +").split(line);

	int ns = sentence.length;
	String verb,predicate,subject,object;
	verb = sentence[0];
	predicate = sentence[1];
	if (ns > 2) {
		subject = sentence[2];
	} else {
		subject = "";
	}
	if (ns > 3) {
		object = sentence[3];
	} else {
		object = "";
	}
	for(int i = 4; i < ns; ++i)
		object += " " + sentence[i];

	if (debug == "yes") {
	  System.err.println(info + "myworld = <"   + myworld + ">");
	  System.err.println(info + "mycontext = <" + mycontext + ">");
	  System.err.println(info + "verb = <"      + verb + ">");
	  System.err.println(info + "predicate = <" + predicate + ">");
	  System.err.println(info + "subject = <"   + subject + ">");
	  System.err.println(info + "object = <"    + object + ">");
	  System.err.println(info + "line = <"      + line + ">");
	}

	String prefix;
	String suffix;
	if (verb.equals("at")) {
		prefix = "(WITH-CONTEXT '";
		suffix = ")";
		predicate = mkr2cyc.cyclify(predicate);
		subject = mkr2cyc.cyclify(subject);
		object = mkr2cyc.cyclify(object);
	} else if (verb.equals("assert")) {
		prefix = p_assert;
		suffix = s_context;
		predicate = mkr2cyc.cyclify(predicate);
		subject = mkr2cyc.cyclify(subject);
		object = mkr2cyc.cyclify(object);
	} else if (verb.equals("query")) {
		prefix = p_query;
		suffix = s_context;
		predicate = mkr2cyc.cyclify(predicate);
		subject = mkr2cyc.cyclify(subject);
		object = mkr2cyc.cyclify(object);
	} else if (verb.equals("do")) {
		prefix = "";
		suffix = "";
	} else {
		System.err.println(error + "line = <" + line + ">");
		continue;
	}
	String cycline = predicate + " " + subject + " " + object;
	cycline = prefix + cycline + suffix;
	if (debug == "yes")
	  System.err.println(info + "cycline = <" + cycline + ">");

	//CycList cyclist = CycList.read(cycline);
	//cycline = CycList.cyclify(cycline);
	System.out.println(cycline);

	String[] answer = {"abc","def","ghi"};
	//QueryLiteral qlit = QueryLiteral(cycline);
	//xxx context = yyy(mycontext);
	//BindingSet answer = BindingSet(qlit,mycontext);

	int na = answer.length;
	if (na == 0) {
		//System.err.println("  " + info + "count = " + na);
	} else {
		//getdata.print_column(answer);
	}
} // end for
	return;
    } // end main()

} // end class

//