This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/LGPL/JPL/java/jpl/Util.java
vsc be83a4a309 jpl stuff
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1120 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2004-08-27 20:27:56 +00:00

173 lines
6.1 KiB
Java

//tabstop=4
//*****************************************************************************/
// Project: jpl
//
// File: $Id: Util.java,v 1.1 2004-08-27 20:27:56 vsc Exp $
// Date: $Date: 2004-08-27 20:27:56 $
// Author: Fred Dushin <fadushin@syr.edu>
//
//
// Description:
//
//
// -------------------------------------------------------------------------
// Copyright (c) 2004 Paul Singleton
// Copyright (c) 1998 Fred Dushin
// All rights reserved.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Library Public License for more details.
//*****************************************************************************/
package jpl;
import java.util.Hashtable;
import java.util.Map;
//----------------------------------------------------------------------/
// Util
/**
* This class provides a bunch of static utility methods for the JPL
* High-Level Interface.
*
* <hr><i>
* Copyright (C) 2004 Paul Singleton<p>
* Copyright (C) 1998 Fred Dushin<p>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.<p>
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library Public License for more details.<p>
* </i><hr>
* @author Fred Dushin <fadushin@syr.edu>
* @version $Revision: 1.1 $
*/
public final class Util {
//------------------------------------------------------------------/
// termArrayToList
/**
* Converts an array of Terms to a JPL representation of a Prolog list of terms
* whose members correspond to the respective array elements.
*
* @param terms An array of Term
* @return Term a list of the array elements
*/
public static Term termArrayToList(Term[] terms) {
Term list = new Atom("[]");
for (int i = terms.length - 1; i >= 0; --i) {
list = new Compound(".", new Term[] { terms[i], list });
}
return list;
}
/**
* Converts a solution hashtable to an array of Terms.
*
* @param varnames_to_Terms A Map from variable names to Terms
* @return Term[] An array of the Terms to which successive variables are bound
*/
public static Term[] bindingsToTermArray(Map varnames_to_Terms) {
Term[] ts = new Term[varnames_to_Terms.size()];
for (java.util.Iterator i = varnames_to_Terms.keySet().iterator(); i.hasNext();) {
Variable k = (Variable) i.next();
ts[k.index] = (Term) (varnames_to_Terms.get(k));
}
return ts;
}
//------------------------------------------------------------------/
// toString
/**
* Converts a substitution, in the form of a Map from variable names to Terms, to a String.
*
* @param varnames_to_Terms A Map from variable names to Terms.
* @return String A String representation of the variable bindings
*/
public static String toString(Map varnames_to_Terms) {
if (varnames_to_Terms == null) {
return "[no solution]";
}
java.util.Iterator varnames = varnames_to_Terms.keySet().iterator();
String s = "Bindings: ";
while (varnames.hasNext()) {
String varname = (String) varnames.next();
s += varname + "=" + varnames_to_Terms.get(varname).toString() + "; ";
}
return s;
}
//------------------------------------------------------------------/
// namevarsToMap
/**
* Converts a (JPL) list of Name=Var pairs (as yielded by atom_to_term/3)
* to a Map from Prolog variables (necessarily in term_t holders) to named JPL Variables
*
* @param nvs A JPL list of Name=Var pairs (as yielded by atom_to_term/3)
* @return Map A Map from Prolog variables (necessarily in term_t holders) to named JPL Variables
*/
public static Map namevarsToMap(Term nvs) {
try {
Map vars_to_Vars = new Hashtable();
/*
while (nvs.hasFunctor(".", 2) && ((Compound) nvs).arg(1).hasFunctor("=", 2)) {
Atom name = (Atom) ((Compound) ((Compound) nvs).arg(1)).arg(1); // get the Name of the =/2 pair
Variable var = (Variable) ((Compound) ((Compound) nvs).arg(1)).arg(2); // get the Var of the =/2 pair
vars_to_Vars.put(var.term_, new Variable(name.name())); // map the Prolog variable to a new, named Variable
nvs = ((Compound) nvs).arg(2); // advance to next list cell
}
*/
while (nvs.hasFunctor(".", 2) && nvs.arg(1).hasFunctor("=", 2)) {
// the cast to Variable is necessary to access the (protected) .term_ field
vars_to_Vars.put(((Variable)nvs.arg(1).arg(2)).term_, new Variable(nvs.arg(1).arg(1).name())); // map the Prolog variable to a new, named Variable
nvs = nvs.arg(2); // advance to next list cell
}
// maybe oughta check that nvs is [] ?
return vars_to_Vars;
} catch (java.lang.ClassCastException e) { // nvs is not of the expected structure
return null;
}
}
//------------------------------------------------------------------/
// textToTerm
/**
* Converts a Prolog source text to a corresponding JPL Term
* (in which each Variable has the appropriate name from the source text).
* Throws PrologException containing error(syntax_error(_),_) if text is invalid.
*
* @param text A Prolog source text denoting a term
* @return Term a JPL Term equivalent to the given source text
*/
public static Term textToTerm(String text) {
// it might be better to use PL_chars_to_term()
Query q = new Query(new Compound("atom_to_term", new Term[] { new Atom(text), new Variable("Term"), new Variable("NVdict")}));
q.open();
Map s = q.getSubstWithNameVars();
if (s != null) {
q.close();
return (Term) s.get("Term");
} else {
return null;
}
}
}