3

私はRubyのPrologであるrubylogを試しています。私の目標は、単語間に論理的なリンクを作成して、他の方法では気付かない可能性のあるドキュメント間の接続を掘り下げることです。私は今日始めたばかりで、同義語検出器で遊んでいます。奇妙なことに、私は同義語のルールをほぼ対称的で推移的なものにしたようです。

この例では、「数学」、「数学」、および「数学」はすべて同義語であることをPrologに教えようとしています。

require 'rubylog'
include Rubylog::DSL::Constants

Symbol.rubylog_functor :synonym
Symbol.rubylog_functor :synonym_of
X.synonym(Y).if X.synonym_of(Y)
X.synonym(Y).if Y.synonym_of(X)
X.synonym(Z).if X.synonym_of(Y).and Y.synonym_of(Z)   ###########

:math.synonym_of! :mathematics
:mathematics.synonym_of! :maths
puts "Synonyms for math: #{:math.synonym(X).to_a}"
puts "Synonyms for maths: #{:maths.synonym(X).to_a}"
puts "Synonyms for mathematics: #{:mathematics.synonym(X).to_a}"

驚いたことに、結果は

Synonyms for math: [:mathematics, :maths]
Synonyms for maths: [:mathematics]
Synonyms for mathematics: [:maths, :math]

問題は、マークされた行がの代わりにを###########使用していることである可能性があると考えたため、ルールが再帰的に記述されていなかった可能性があります。しかし、その行をに変更すると、非常に奇妙な出力が得られますsynonym_ofsynonymX.synonym(Z).if X.synonym_of(Y).and Y.synonym(Z)

Synonyms for math: [:mathematics, :maths, :math, :mathematics]
Synonyms for maths: [:mathematics]
Synonyms for mathematics: [:maths, :math, :mathematics]

とても好奇心が強い!どう思いますか?

4

1 に答える 1

1

有向グラフで推移閉包をモデル化した後、推移プロパティに再帰規則を使用する必要がありますが、ループを防ぎます。

私が提案できる実用的な方法は、シノニムのルールを明示的に記述することです(申し訳ありませんが、私は ruby​​log を持っていません。SWI-Prolog でテストしています)。

synonym(X, Z) :- synonyms(X, L), member(Z, L).

synonym_of(math, mathematics).
synonym_of(mathematics, maths).

synonyms(X, Ss) :- synonyms(X, [], Ss).

synonyms(X, Found, R) :-
    ( synonym_of(X, S) ; synonym_of(S, X) ),
    \+ member(S, Found),
    !, synonyms(S, [S|Found], R).
synonyms(_, Found, Found).
于 2012-09-22T08:25:59.820 に答える