私は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_of
synonym
X.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]
とても好奇心が強い!どう思いますか?