Allow PrologControl to set the PrologClassLoader

This permits embedding applications to choose which ClassLoader will
provide the Prolog predicates available to the runtime. If none is
configured, the engine will use the system ClassLoader.
diff --git a/src/lang/Prolog.java b/src/lang/Prolog.java
index f9b3d5e..693bcfe 100644
--- a/src/lang/Prolog.java
+++ b/src/lang/Prolog.java
@@ -115,8 +115,6 @@
 	cont       = null;
 	stack      = new CPFStack(this);
 	trail      = new Trail(this);
-	//	pdl        = new PushDownList();
-	pcl        = new PrologClassLoader();
     }
 
     /** 
@@ -134,6 +132,8 @@
      */
     protected void initOnce() {
 	aregs      = new Term[maxArity];
+	if (pcl == null)
+	  pcl = new PrologClassLoader();
 	if (internalDB == null)
 	  internalDB = new InternalDatabase();
 
diff --git a/src/lang/PrologClassLoader.java b/src/lang/PrologClassLoader.java
index 2d5e0a7..5bd4bc5 100644
--- a/src/lang/PrologClassLoader.java
+++ b/src/lang/PrologClassLoader.java
@@ -8,6 +8,18 @@
  * @version 1.1
  */
 public class PrologClassLoader extends ClassLoader implements Serializable {
+    /** Initialize using the {@link ClassLoader#getSystemClassLoader()}.  */
+    public PrologClassLoader() {
+    }
+
+    /**
+     * Initialize using a specific parent ClassLoader.
+     *
+     * @param parent source for all predicates in this context.
+     */
+    public PrologClassLoader(ClassLoader parent) {
+      super(parent);
+    }
 
     /**
      * Returns a <code>java.lang.Class</code> object associated with the predicate
diff --git a/src/lang/PrologControl.java b/src/lang/PrologControl.java
index 875c096..9d5cc31 100644
--- a/src/lang/PrologControl.java
+++ b/src/lang/PrologControl.java
@@ -43,6 +43,17 @@
       engine.internalDB = new InternalDatabase(size);
     }
 
+    public PrologClassLoader getPrologClassLoader() {
+      if (engine.pcl == null)
+        engine.pcl = new PrologClassLoader();
+      return engine.pcl;
+    }
+    public void setPrologClassLoader(PrologClassLoader cl) {
+      if (engine.aregs != null)
+        throw new IllegalStateException("Prolog already initialized");
+      engine.pcl = cl;
+    }
+
     public int getMaxArity() { return engine.getMaxArity(); }
     public void setMaxArity(int max) {
       if (max < 8)
@@ -67,7 +78,7 @@
      */
     public void setPredicate(Term t)  {
 	try {
-	    Class clazz = engine.pcl.loadPredicateClass("jp.ac.kobe_u.cs.prolog.builtin", "call", 1, true);
+	    Class clazz = getPrologClassLoader().loadPredicateClass("jp.ac.kobe_u.cs.prolog.builtin", "call", 1, true);
 	    Term[] args = {engine.copy(t)};
 	    code = (Predicate)(clazz.newInstance());
 	    code.setArgument(args, new Success(this));