2
sitting(mary, james).
sitting(rosie, andrew).
sitting(kiera, tom).

issitting(X, Y) :- sitting(X, Y).

やあみんな、私は基本的に誰が誰の隣に座っているのか真偽の値をチェックしたいのですが、

コンパイラを入力すると

issitting(rosie, andrew). 

ただし、入力すると真の値が返されます

issitting(andrew, rosie). 

false値が返されます(互いに隣接しているため、trueになるはずです)。ユーザーが(すべての可能な組み合わせで)隣同士に座っているかどうかを確認する場合に備えて、3行のコードを追加したくありません。

ユーザーが名前を切り替えても、それらがまだ真である(偽ではない)ことをPrologに理解させるために、ルールをどのように変更しますか。

なぜそれが私に「偽」を与えているのか理解できません。

私は立ち往生していて、これは私がこれまでに成し遂げることができた最高のものです:/

ありがとうございました。

4

1 に答える 1

6

(問題を指摘することはできますが、それでは何も学習しません。SWIを使用していると思います。これは、false返されると言っているからです。)

?- issitting(andrew, rosie).
false.

あなたの問題が何であるかを言い換えさせてください:あなたはそれissitting(andrew, rosie)が真実であると期待しています。そうではありません。その質問を人に聞いたらどうしますか?おそらくあなたはなぜ尋ねるでしょう?なぜandrew隣に座っていないのrosieですか?そして、たとえば、あなたは説明を理解していなかった、あなたは別の質問をしたかもしれません:

andrew少なくとも誰かの隣に座っていますか?

したがって、この質問は元の質問を一般化したものです。Prologでは、次のような変数を使用してまったく同じことを行うことができます。

?- issitting(andrew, Anyone).
false.

だから今、私たちはそれandrewが誰の隣にも座っていないことを知っていますか?混乱している?さて、クエリをもう一度一般化することができます:

誰かの隣に少なくとも一人座っていますか?

?- issitting(Person, Anyone).
Person = mary,
Anyone = james ;
Person = rosie,
Anyone = andrew ;
Person = kiera,
Anyone = tom.

ですから周りには何人かの人がいます。事実上、その理由はあなたが持っているということでありsitting/2、別の関係がありissitting/2ます。issitting/2次のルールを追加して一般化する必要があります。

issitting(X, Y) :- sitting(Y, X).

しかし、要点は、優れた一般的なデバッグ戦略を示すことでした。

予期しない失敗が発生した場合は、クエリ(およびプログラム)を一般化してみてください。

于 2013-01-09T02:39:47.643 に答える