2014-10-03 3 views
3

프롤로그에서 AI에 대한 지식 기반을 구축하려고합니다. 먼저 Prolog를 배우려고합니다. 코끼리, 거대한 개미 등 장난감 예제를 통해 사용합니다.JPL에서 여러 결과로 프롤로그 쿼리

NetBeans 8.0.1, SWI-Prolog 6.6.6 및 Windows 8.1을 사용하고 있습니다. 모든 것이 64 비트이고 환경 변수가 올바르게 설정되어 있습니다. 내 NetBeans 라이브러리의 jpl.jar에 링크되어 있습니다.

내 프롤로그 기술 자료는 다음과 같습니다

bigger(elephant, horse). 
bigger(horse, donkey). 
bigger(donkey, dog). 
bigger(donkey, monkey). 
bigger(monkey, ant). 
bigger(monkey, dog). 
bigger(giant_ant, elephant). 

is_bigger(X, Y) :- bigger(X, Y). 
is_bigger(X, Y) :- bigger(X, Z), is_bigger(Z, Y). 

this에 의해 영감을. 지식 기반은 SWI-Prolog에서 오류없이 작동합니다.

그러나 X가 Java에서 ant보다 큰 경우 여러 답변을 얻으려고하면 스택 오버플로 오류가 발생합니다.

이 코드는 JPL이 사용되는 Java 코드 조각입니다.

Query q1 = 
    new Query(
     "consult", 
     new Term[] {new Atom("pathToFile\\bigger.pl")} 
    ); 

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

Query q2 = 
    new Query(
     "bigger", 
     new Term[] {new Atom("giant_ant"),new Atom("elephant")} 
    ); 
Boolean resp= q2.query(); 
System.out.println("bigger(elephant, horse) is " + resp.toString()); 

Query q3 = 
    new Query(
     "is_bigger", 
     new Term[] {new Atom("giant_ant"),new Atom("ant")} 
    ); 

System.out.println(
    "is_bigger(giant_ant, ant) is " + 
    (q3.query() ? "provable" : "not provable") 
); 

Query q4 = new Query("is_bigger(X, ant)"); 

java.util.Hashtable solution; 

q4.query(); 

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

Java 코드는 대부분 here에서 가져 왔습니다.

NetBeans의 디버거에서 Java가 코드 단편 끝에 solution.get("X")의 값을 결정하려고 할 때 스택 오버플로 오류가 발생하는 것으로 보입니다. 이 문제를 해결하는 방법에 대한

consult succeeded 
bigger(elephant, horse) is true 
is_bigger(giant_ant, ant) is provable 
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at jpl.Term.getTerm(Term.java:614) 
at jpl.Term.getTerm(Term.java:652) 
at jpl.Term.getTerm(Term.java:652) 
at jpl.Term.getTerm(Term.java:652) 
at jpl.Term.getTerm(Term.java:652) 
at jpl.Query.get1(Query.java:334) (and many more like this.) 

어떤 아이디어 :

이 내 콘솔 출력처럼 보이는 무엇인가? 필요한 경우 더 많은 정보를 기꺼이 제공하겠습니다.

+0

자바에 대한 스택 크기를 늘리려고? '-ss'와'-oss' 플래그가 도움이 될 수 있습니다. –

+0

-ss를 사용하여 스택 크기를 늘리면이 경우 프로그램이 indefinetly하게됩니다. – m0rch

답변

0

나는 더 이상 내 컴퓨터에서 JPL을 실행할 수 있지만, 문서보고에서 당신이 Variable 객체를 사용하고 q3 위해 한 당신처럼 쿼리를 생성 할 수 있습니다 얻을 수 없다 : 당신이

Variable X = new Variable("X"); 
Query q4 = new Query("is_bigger", new Term[]{X, new Atom("ant")}); 

while (q4.hasMoreElements()) { 
java.util.Hashtable solution = (Hashtable) q4.nextElement(); 
System.out.println("X = " + (Term) solution.get("X")); 
} 
+0

이렇게하면 오류를 숨기는 것 같습니다. 콘솔에서 스택 오버플로 오류가 발생하는 대신 X = null 인스턴스 5 개 (올바른 솔루션 양!)를 얻습니다. 그러나 내가 중단 점을 사용하고 "수동으로"솔루션이 저장된 것을 볼 수있는 경우 값이 표시되어야하는 상자에서 잠시 후 동일한 스택 오버플로 오류가 발생합니다. 나는 또한 내 질문에 동일한 오류가 연결된 스레드에서 두 번째 솔루션과 같은 화합물을 사용하여 시도했다. – m0rch

+0

죄송합니다, 어떻게 든이 답변의주의를 잃었습니다. 가능한 해결책으로 편집했습니다. 내 컴퓨터에서 JPL 창을 실행하지 않습니다. 그러나 변수의 이름을 반드시 지정해야합니다. –