0
emissionOf(alpha).
emissionOf(beta).

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).

なんらかの (おそらく明らかな) 理由で、Prolog が上記のコードの最後の行を受け入れないという問題に直面しています。その理由には次のことが関係しています。

detected(proton), detected(electron)

私がちょうどしようとすると

detected(proton)

それは正しく動作します。

何が問題ですか?私は、アルファとベータの両方の放出がある場合、陽子と電子の両方の検出があると述べようとしています.

ありがとう

4

3 に答える 3

5

PROLOG の句は Horn 句です。さらに、次のような節の頭にある接続詞が起こります。

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).

...(これは Horn 節ではありません) は、実際には次の 2 つの個別のHorn 節と同等です。

detected(proton) :- emissionOf(alpha), emissionOf(beta).
detected(electron) :- emissionOf(alpha), emissionOf(beta).

...というのは、事実detected(proton)との両方detected(electron)が身体の目標の結合によって暗示されているからです。

プログラムが意味することをエンコードするには、次のような同等の方法が他にもいくつかあることに注意してください (例として)。

emissionOf(alpha).
emissionOf(beta).

detected(X) :- 
  emissionOf(alpha), 
  emissionOf(beta), 
  (X = proton; X = electron).

ゴールを実行すると、atomにdetected(X)バインドされ、次にon backtracking にバインドされます。Xprotonelectron

于 2010-09-24T23:41:07.687 に答える
1

と同等です

,(detected(proton),detected(electron)) :- emissionOf(alpha), emissionOf(beta).

,/2基本的に演算子を再定義しようとしていますが、これは許可されていません。どのようなエラー メッセージが表示されましたか?

何を言おうとしているのですか?detected(proton)detected(electron)が true の場合emissionOf(alpha)、 との両方emissionOf(beta)が true ですか? その場合、@sharky が言ったように、2 つの句に分割する必要があります。

detected(proton) :- emissionOf(alpha), emissionOf(beta).
detected(electron) :- emissionOf(alpha), emissionOf(beta).

これにより、バックトラッキングに関する両方のソリューションが得られます。これは、彼の 2 番目の提案よりも明確であると思います。

于 2010-09-25T00:08:49.253 に答える
0

私に言われたことから、それは Prolog のアルゴリズムに固有のものです。各文はホーン節でなければなりません。

于 2010-09-24T15:00:20.190 に答える