1

我已经实现了几个链式规则,最后一个规则根据前面的结果获得所需的结果。

rule1(X,Y) :-
   pred1(X,Z),
   pred1(Y,Z).

rule2(Z,T) :- 
   rule1(X,Y),
   pred2(Z,X),
   pred2(T,Y).

我需要获得为每条规则推断出的每一个事实。我正在使用 jpl 库从 Java 执行此操作。

String stringFileQuery = "rule1(X,Y)";
System.out.println(stringFileQuery + " "
   + (Query.hasSolution(stringFileQuery) ? "succeeded" : "failed"));
Query fileQuery = new Query(stringFileQuery);
System.out.println("all solutions of " + stringFileQuery);
while (fileQuery.hasMoreSolutions()) {
    Map<String, Term> s10 = fileQuery.nextSolution();
    System.out.println("First -> " + s10.get("X") + ", Second ->" + 10.get("Y"));
}

即使在 Prolog 中,我如何才能获得所有这些事实?在实际程序中,我有不止两条规则。

4

1 回答 1

1

您在这里寻找的是 Prolog 的元解释器,它记录事实的进行。由于 Prolog 是一种谐音语言,因此编写一个简单的元解释器是微不足道的。

您可能会想用它clause_property/2来检查您正在检查的子句是否是事实,就像这样

recordFacts(Goal, [Goal|Facts]) :-
    clause(Goal, _Body, Ref),
    clause_property(Ref, fact).

编辑

一个完整的例子就像

recordFacts(Goal, Facts) :-
    recordFacts(Goal, [], AllFacts),
    list_to_set(AllFacts, Facts).

recordFacts((Goal, RestOfGoals), FactsIn, FactsOut) :-
    recordFacts(Goal, FactsIn, FactsH),
    recordFacts(RestOfGoals, FactsH, FactsOut).

recordFacts(Goal, Facts, [Goal|Facts]) :-
    clause(Goal, _, Ref),
    clause_property(Ref, fact).

recordFacts(Goal, FactsIn, FactsOut) :-
    clause(Goal, Body, Ref),
    not(clause_property(Ref, fact)),
    not(clause_property(Ref, predicate(system: (',')/2))),
    recordFacts(Body, FactsIn, FactsOut).
于 2016-06-22T10:00:20.960 回答