프롤로그에서 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.)
어떤 아이디어 :
이 내 콘솔 출력처럼 보이는 무엇인가? 필요한 경우 더 많은 정보를 기꺼이 제공하겠습니다.
자바에 대한 스택 크기를 늘리려고? '-ss'와'-oss' 플래그가 도움이 될 수 있습니다. –
-ss를 사용하여 스택 크기를 늘리면이 경우 프로그램이 indefinetly하게됩니다. – m0rch