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 であっても、これらすべての事実を取得するにはどうすればよいですか? 実際のプログラムでは、2 つ以上のルールがあります。

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 に答える