4

私は、Prologのような言語で次のようなものを書くことができることを知っています:

mortal(X):-man(X)。%すべての男性は致命的です
男(ソクラテス)。%ソクラテスは男です

?-致命的(ソクラテス)。%ソクラテスは致命的ですか?
はい

私が欲しいのはこのようなものですが、逆です。私がこれを持っているとしましょう:

mortal(X):-man(X)。
男(ソクラテス)。
男(プラトン)。
男(アリストテレス)。

次に、mortal(X)が真であるランダムXを与えるように要求します(したがって、ランダムシードに応じて「ソクラテス」、「プラトン」、または「アリストテレス」のいずれかを与える必要があります)。

私の質問は次のとおりです。

  • この種の逆推論には名前がありますか?
  • それをサポートする言語やライブラリはありますか?

編集

以下の誰かが指摘しているように、あなたは単にmortal(X)に尋ねることができ、それはすべてのXを返し、そこからあなたは単にリストからランダムなものを選ぶことができます。しかし、そのリストが非常に大きく、おそらく数十億になるとしたらどうでしょうか。明らかにその場合、1つを選ぶ前にすべての可能な結果を​​生成することはできません。

これが実際の問題になることを確認するために、「adjective1 noun1adverbtransitive_verbadjective2noun2」という形式のランダムな文を生成する単純な文法を想像してみてください。形容詞、名詞、動詞などのリストが非常に大きい場合は、組み合わせ爆発がどのように問題であるかを確認できます。各リストに1000語が含まれている場合、1000^6の可能な文があります。

4

3 に答える 3

2

Prolog のディープ ファースト検索の代わりに、ランダム化されたディープ ファースト検索戦略を簡単に実装できます。必要なのは、選択点でプログラム フローをランダム化して、選言に到達するたびに検索ツリー (= プロローグ プログラム) のランダムな極が最初の極の代わりに選択されるようにすることだけです。

ただし、このアプローチは、すべてのソリューションの可能性が等しいことを保証するものではないことに注意してください。これを保証するには、各極によって生成される解の数を事前に把握して、それに応じてランダム化に重みを付ける必要があります。

于 2011-11-16T09:52:37.247 に答える
0

n番目の解を直接計算できるとは思いませんが、最初のn個の解(ランダムに選択されたn個)を計算し、最後の解を選択できます。もちろん、n=10^(big_number) の場合、これは問題になります...

次のようなこともできます

mortal(ID,X) :- man(ID,X).

man(X):- random(1,4,ID), man(ID,X).
man(1,socrates).
man(2,plato).
man(3,aristotle).

しかし、問題は、すべての人が死ぬわけではない場合、たとえば 100 万人に 1 人しか死ぬことができない場合は、多くの検索を行う必要があることです。乱数を見つけるまで乱数を試して、方程式の解を探すようなものです。数値に近い解を見つけるためにある種のヒューリスティックを開発できますが、それはランダム性に (マイナスの) 影響を与える可能性があります。

より効率的に行う方法はないと思います。解のセットを計算して 1 つを選択するか、1 つの解が見つかるまですべての解のスーパーセットの 1 つのメンバーを選択する必要があります。しかし、私の言葉を鵜呑みにしないでください xd

于 2011-11-16T08:07:27.703 に答える
0

私は Prolog などを使用したことはありませんが、ウィキペディアがこの件について述べていることから判断すると、

?- mortal(X).

真であるすべてをリストする必要がmortalあります。その後、結果の1つを選択するだけです。

ですから、あなたの質問に答えるために、

  • 「変数を含むクエリ」を使用します
  • 私が知る限り、Prolog自体はそれをうまくサポートするはずです。
于 2011-11-16T02:12:09.150 に答える