Как обрабатывать списки прологов в Java - PullRequest
0 голосов
/ 20 октября 2011

Я использую jpl для соединения Java и пролога. Я пытаюсь обрабатывать списки прологов в 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»

В то же время я не могу обработать все элементы списка. Пожалуйста, помогите мне сделать это?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2017

Вы можете определить метод, подобный этому

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

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

и вместо списка вы можете использовать в массиве

0 голосов
/ 21 октября 2011

Я никогда не использовал этот API раньше, но быстрый взгляд на Javadocs для jpl.Term показывает, что вы можете вызвать args(), чтобы получить массив (Term[]) содержащий все результаты.

Вы можете пройти через эти:

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

Также обратите внимание, что объектная модель допускает n-глубокое вложение, поэтому, если вы хотите распечатать полное дерево результатов, вам нужно выполнить повторение, проверяя каждый термин isCompound() ...

...