2

したがって、DLV で実行する ASP で記述された一連のファクトとクエリがあります。

%Q1 : Find the implicit "is_a" relationship between terms
%ex: if term A is is_a term B, term B is_a term C, then term A is_a term C  
%is_a One level
    triple1(TermA, "go:is_a", TermB):- triple(TermA, "go:is_a", TermB), TermA != TermB.
%is_a MultiLevel
triple1(TermA, "go:is_a", TermC) :-
    triple(TermA, "go:is_a", TermB),
    triple(TermB, "go:is_a", TermC),
    TermA != TermC.
triple1(TermA, "go:is_a", TermC) :-
    triple1(TermA, "go:is_a", TermB),
    triple1(TermB, "go:is_a", TermC),
    TermA != TermC.

triple1次に、回答セットに事実が含まれていないトリプルの数を数えたいと思います。次に、このような集計 #count クエリを作成しました。

triple1nr(X) :- #count{TermA : triple1(TermA,"go:is_a",TermC)} = X. 

しかし、私が得たのは、結果として表示される変数の数だけでしたTermA。そして、クエリを次のように変更したとき:

triple1nr(X) :- #count{triple1(TermA,"go:is_a",TermC)} = X. 

それは私にエラーを与えます。このクエリを実行するにはどうすればよいですか?

4

1 に答える 1

2

他のソルバーの知識に基づいて、あなたのコードは TermA と TermC の組み合わせを数えておらず、TermC のバリエーションを無視していると思います。組み合わせをカウントするように指示する必要があります。

triple1nr(X) :- #count{TermA,TermC : triple1(TermA,"go:is_a",TermC)} = X.

しかし、私は dlv を使用しておらず、インストールもしていないため、この回答は間違っている可能性があります。自分でテストしてください。

于 2014-12-02T10:12:41.217 に答える