Запрос переменных Пролога с помощью JPL

Я хочу сделать запрос на использование Prolog в java через JPL, я прочитал документацию (http://www.swi-prolog.org/packages/jpl/java_api/getting_started.html). Предикаты пролога следующие:

child_of(joe, ralf).
child_of(mary, joe).
child_of(steve, joe).
child_of(steve, ralf).

descendent_of(X, Y) :-
    child_of(X, Y).
descendent_of(X, Y) :-
    child_of(Z, Y),
descendent_of(X, Z).

Мой код выглядит так

Variable X = new Variable();

        Query q4 =
            new Query(
                "descendent_of",
                new Term[] {X,new Atom("joe")}
            );

        java.util.Hashtable solution;

        while ( q4.hasMoreSolutions() ){
            solution = q4.nextSolution();
            System.out.println( "X = " + solution.get(X));
        }

Согласно моим предикатам пролога, мой java-код должен извлекать 'mary' и 'steve', но я получаю следующее:

X = null
X = null

Что я делаю не так? заранее спасибо

РЕДАКТИРОВАТЬ: это все мое тестирование

Query q1 =
    new Query(
        "consult",
        new Term[] {new Atom("C:\\Users\\cardozo\\Documents\\fer\\info2\\lore\\test.pl")}
    );

return q1;

System.out.println( "consult " + (q.query() ? "succeeded" : "failed"));

Query q2 =
    new Query(
        "child_of",
        new Term[] {new Atom("joe"),new Atom("X")}
    );
Boolean resp= q2.query();
System.out.println("child_of(joe,X) is " + resp.toString()
);

Query q3 =
    new Query(
        "descendent_of",
        new Term[] {new Atom("steve"),new Atom("ralf")}
    );

System.out.println(
    "descendent_of(joe,ralf) is " +
    ( q3.query() ? "provable" : "not provable" )
);

Variable X = new Variable();

Query q4 =
    new Query(
        "descendent_of",
        new Term[] {X,new Atom("joe")}
    );

java.util.Hashtable solution;

q4.query();

while ( q4.hasMoreSolutions() ){
    solution = q4.nextSolution();
    System.out.println( "X = " + solution.get("X"));
}

И это то, что я получаю в своей консоли java в результате

run:
% C:\Users\cardozo\Documents\fer\info2\lore\test.pl compiled 0.00 sec, 8 clauses
consult succeeded
child_of(joe,X) is false
descendent_of(joe,ralf) is provable
X = null
X = null
BUILD SUCCESSFUL (total time: 0 seconds)

person Naty Bizz    schedule 15.07.2012    source источник
comment
Я не вижу, чтобы вы заполняли базу данных. См. консультацию на этой странице.   -  person Joop Eggen    schedule 15.07.2012
comment
Консультация @JoopEggen предназначена не только для открытия файла пролога? Я открываю свой pl-файл ранее, используя класс Query, указанный на этой странице.   -  person Naty Bizz    schedule 15.07.2012


Ответы (2)


Я бы попробовал получить переменную по имени:

solution.get("X")

изменить

с буквальным запросом вроде

Запрос q4 = новый запрос ("descendent_of (X, joe)")

person CapelliC    schedule 15.07.2012
comment
извините за задержку, у меня были небольшие проблемы с настройкой JPL - person CapelliC; 16.07.2012

Я нашел решение, мне нужно использовать класс Compound (включенный в jpl) следующим образом

Query q4 = new Query(new Compound("descendent_of", new Term[] { new Variable("X"), new Atom("joe")}));

while ( q4.hasMoreSolutions() ){
            solution = q4.nextSolution();
            System.out.println( "X = " + solution.get("X"));
        }

И я получаю решение

X = mary
X = steve
person Naty Bizz    schedule 15.07.2012