2012-07-15 2 views
3

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

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

по моему Prolog предикатов, мой Java-код должны получить «Мэри» и «Стив», но я получаю это:

X = null 
X = null 

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

EDIT: это все мое тестирование

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) 
+0

Я не вижу вас наполняя т он база данных. См. «**» ** на этой странице. –

+0

@JoopEggen consult не только для открытия прологового файла? Сначала я открываю свой файл pl, используя класс Query, указанный на этой странице. –

ответ

2

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

solution.get("X") 

ed это

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

Запрос q4 = новый запрос («descendent_of (Х, JOE)»)

+0

тоже не работает, я добавил весь свой код в свой вопрос –

+0

извините за задержку, у меня была небольшая проблема в настройке JPL – CapelliC

+0

, спасибо, это лучшее решение, чем мое –

3

Я нашел решение, я должен использовать класс соединение (входит в ЛРД), как это

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 
Смежные вопросы