Ошибка при выполнении запроса в tuProlog - PullRequest
1 голос
/ 18 сентября 2010

я скачал tuprolog и не могу получить результат для следующего запроса, пока я получаю ответ в PROL ide .. может кто-нибудь помочь?

verb(admit-1).
verb(work-4).
nsubjpass(admit-1, patient-2).
agent(admit-1, doctor-3).
nsubj(work-4, who-5).
aux(work-4, be-6).
rcmod(doctor-3, work-4).
prep_in(work-4, clinic-7).


aggregation('part of').
aggregation('belongs to').
aggregation('subdivision of').
aggregation('have').
aggregation('contain').
aggregation('comprise').
aggregation('include').
aggregation('define').
aggregation('consist of').
aggregation('compose of').
aggregation('denote by').
aggregation('identify by').
aggregation('make up of').
aggregation('record with').

attribute('have').
attribute('contain').
attribute('comprise').
attribute('include').
attribute('define').
attribute('consist of').
attribute('compose of').
attribute('denote by').
attribute('identify by').
attribute('make up of').
attribute('record with').

generalization('be').
generalization('kind of').
generalization('type of').
generalization('classify into').
generalization('consider').

object(X) :- noun(X).
relation(X) :-  verb(X).
rel(X,Y) :- nsubjpass(X,Y).
rel(X,Y) :- agent(X,Y).
rel(X,Y) :- nsubj(X,Y).
rel(X,Y) :- aux(X,Y).
rel(X,Y) :- rcmod(X,Y).
rel(X,Y) :- prep_in(X,Y).

associatedWith(X,Y) :- rel(X,Y).
associatedWith(X,Y,Z) :- verb(Y),associatedWith(X,Y), associatedWith(Y,Z).
associatedWith(X,Y,Z) :- verb(X),associatedWith(X,Y), associatedWith(X,Z).
rel_aggregation(X,Y,R):-rel(X,Y).aggregation(R).

?- associatedWith(X,Y,Z).

Мне нужно обработать такого рода отношения и снова обработать вывод в Java

Может кто-нибудь сказать, как интегрировать пролог и Java?

EDIT: я получаю эту ошибку в tuprolog путем реализации кода

этот код работает для связанных с (X, Y). то есть с 2 аргументами, но не работает, когда я даю 3 аргумента, связанных с (X, Y, Z). что делать .. пожалуйста, помогите мне получить это исключение

java.lang.ClassCastException: alice.tuprolog.Var cannot be cast to alice.tuprolog.Struct
        at alice.tuprolog.lib.BasicLibrary.agent_2(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at alice.tuprolog.PrimitiveInfo.evalAsPredicate(Unknown Source)
        at alice.tuprolog.StateGoalEvaluation.doJob(Unknown Source)
        at alice.tuprolog.Engine.run(Unknown Source)
        at alice.tuprolog.EngineManager.solve(Unknown Source)
        at alice.tuprolog.Prolog.solve(Unknown Source)
        at javaapplication9.Main.main(Main.java:26)
Exception in thread "main" alice.tuprolog.NoSolutionException
        at alice.tuprolog.SolveInfo.getSolution(Unknown Source)
        at javaapplication9.Main.main(Main.java:28)
Java Result: 1

Ответы [ 2 ]

5 голосов
/ 18 сентября 2010

Основные объекты tuProlog, которые вам нужно обработать в Java: Theory, которые вы можете использовать для представления программы Prolog; Prolog, это переводчик, которому вы будете задавать вопросы; и SolveInfo, содержащий данные для каждого решения, найденного интерпретатором.

Предположим, что ваша программа Prolog (т.е. весь код, который вы опубликовали, кроме последней строки) содержится в файле с именем theory.pl. Грубо говоря (т.е. по модулю импорта и исключения), процедура, которой вы должны следовать, похожа на:

Prolog engine = new Prolog();
Theory theory = new Theory(new FileInputStream("theory.pl"));
engine.setTheory(theory);
SolveInfo solution = engine.solve("associatedWith(X, Y, Z).");
if (solution.isSuccess()) {
    System.out.println(solution.getTerm("X"));
    System.out.println(solution.getTerm("Y"));
    System.out.println(solution.getTerm("Z"));
}

Если ваш запрос может привести к более чем одному решению, используйте цикл while, чтобы проверить существование точек открытого выбора с помощью Prolog.hasOpenAlternatives и получить другое решение с помощью Prolog.solveNext.

Глава 8 в руководстве (файл PDF, который вы должны найти в подкаталоге doc любого дистрибутива tuProlog) содержит множество небольших примеров усложнения взаимодействия с Prolog из кода Java (см., В частности, раздел 8.4).

3 голосов
/ 18 сентября 2010

agent / 2 - это встроенный предикат в tuProlog - вы можете попробовать переименовать вашу версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...