2011-10-20 47 views
0

我正在使用jpl連接java和prolog。我正在嘗試處理java中的prolog列表。我執行時序言代碼返回類似下面的如何處理java中的prolog列表

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

現在,我嘗試使用下面的代碼

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); 
    } 
} 

執行此我們得到查詢的第一個解決方案來處理在Java中此輸出列表這是

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

而我能夠打印出列表的第一個元素是「38」

在相同的我無法處理列表中的所有元素。請幫我做這個?

回答

0

我以前從未使用過這個API,而是一個快速瀏覽一下Javadocs for jpl.Term顯示,你可以調用args()獲得包含所有結果的陣列(Term[])。

您可以通過這些循環:

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

還要注意的是,對象模型允許正深度嵌套,所以如果你要打印結果的一個完整的樹,你需要遞歸,檢查每個學期的isCompound() ...

+0

我試過使用Term [],但是如何顯示所有的參數。使用你的for循環,我只能顯示第一個參數。 – Anil

0

您可以定義一個方法,像這樣

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

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

和取代列表,你可以在陣列

使用