0

Prolog には、MaxScore >0 の場合は yes、それ以外の場合は no という単純な述語があります。したがって、MaxScore が 0 の場合、結果は明らかに No になります。しかし、これは起こりません。これをよく見てください:https://dl.dropbox.com/u/18710637/prologIsInsane.png

または対応するコード:

aiPlay(PlayerNum, Board, Pos, BotType) :-
    aiTryAll(Board, PlayerNum, ScoreList, 0),
    scoreListGetPos(ScoreList, 1, Pos, MaxScore),
    write('MaxScore: '), write(MaxScore), nl,
    MaxScore > 0.

対応する出力:

| ? myQuery(Pos).
MaxScore: 0
MaxScore: 0
MaxScore: 1
Pos = 6 ?
yes
| ?

私はこれで気が狂っています。誰が何が起こっているのか手がかりを持っていますか?

4

1 に答える 1

4

特に問題はありません。このコードを検討してください:

foo(0).
foo(0).
foo(1).

bar:-
    foo(X),
    write(X), nl,
    X > 0.

Prolog はまず(最初の から) と統合Xし、出力を出力してから失敗します。次に、prolog はバックトラックして 2 番目を選択します。再び同じ。最後に、と統合され、が返されます。0foo(0)0 > 0foo(0)X1bartrue

当然、印刷などの副作用は元に戻す/バックトラックできないため、ターミナルには次のように表示されます。

0
0
1
true

それをどのように解決するかは、何をしたいかによって異なります。印刷したい場合Max Core = 1は、 を確認してから印刷できますMaxScore>0。ただし、一般的には、プログラムの深い述語ではなく、最後に印刷 (必要な場合) を行う方が適切です。

ところで、スクリーンショットではなく、実際のコードと出力を投稿する方がよいでしょう。コードをコピーして貼り付けてデバッグするのが簡単になります。また、実行可能な例を示すことをお勧めします。使用する述語の半分aiPlay/4は未定義であるため、問題は上記で述べたものであると推測しています:p

于 2012-11-03T10:32:19.790 に答える