0

我正在使用 jpl 连接 java 和 prolog。我正在尝试处理 java 中的序言列表。执行时我的序言代码返回如下列表

L = [38, '(60)', '48^10', '36^6^58']

现在我正在尝试使用以下代码在 java 中处理此输出

import jpl.Integer;
import jpl.Query;
import jpl.Variable;
import jpl.JPLException;
import jpl.Term;
import java.awt.List;
import java.lang.Number;
import java.util.Hashtable;
import java.util.Iterator;
public class Family
{   
    int num1;
    public static void  main( String argv[] )
    {       
        String t1 = "consult('Test.pl')";
        Query q1 = new Query(t1);
        System.out.println( t1 + " "
            + (q1.hasSolution() ? "succeeded" : "failed") );
        String t4 = "main(X)";
        Query q4 = new Query(t4);
        System.out.println( "first solution of " + t4 + ": X = "
            +   q4.oneSolution().get("X"));

        Term listTerm = (Term) q4.oneSolution().get("X");
        Term firstListItem = listTerm.arg(1);       
        System.out.println("" + firstListItem);
    }
}

执行此操作,我们得到查询的第一个解决方案,即

    X = '.'(38, '.'('(60)', '.'('48^10', '.'('36^6^58', []))))
38

而且我能够打印出列表的第一个元素“38”

同样,我无法处理列表中的所有元素。请帮我这样做?

4

2 回答 2

0

我以前从未使用过这个 API,但快速浏览一下Javadocs 就可以jpl.Term看出,您可以调用来获取包含所有结果args()的数组 ( )。Term[]

您可以遍历这些:

...
for (Term oneTerm : listTerm.args()) {
  System.out.println(oneTerm);
}

另请注意,对象模型允许 n 深嵌套,因此如果要打印完整的结果树,则需要递归,检查每个 Term 的isCompound()...

于 2011-10-20T20:00:07.893 回答
0

您可以定义这样的方法

private static String lista(Term listTerm) {
    String lista="";

    while(listTerm.arity() == 2){
        lista = lista + listTerm.arg(1);
        listTerm = listTerm.arg(2);
     }
    return lista;
}

而不是列表,您可以在数组中使用

于 2017-04-17T14:02:10.670 回答