チェスをした人のグループがあるとします。あなたは決して誰にも負ける(無敗の)プレーヤーが存在するかどうかを判断したい。事実がウォン(ジェームス、トム)として与えられたと仮定しよう。ウォン(ジェイムス、ピーター)、ウォン(クレイグ、トム)。失われた(ピーター、トム)。すると、条件に応じてプレーヤーXが失われたことはありません。相互に排他的な、またはプロローグの作成
undefeated(X) :- \+ won(_, X), \+ lost(X, _).
ので、無敗(ジェームズ)(クレイグ)真と無敗のですが(ピーター)真が、無敗(トム)と無敗のですfalseです。今、問題は、単にnoを返すので、無敗(X)を呼び出すときに発生します。これを解決するために、開始時に常に真であるステートメントが必要なので、白と黒の部分をそれぞれ再生するプレイヤーに対して、事実whiteplayer()とblackplayer()を追加します。
whiteplayer(james).
whiteplayer(craig).
whiteplayer(tom).
whiteplayer(peter).
blackplayer(james).
blackplayer(peter).
blackplayer(tom).
との無敗変更:
undefeated(X) :- (whiteplayer(X); blackplayer(X)), \+ won(_, X), \+ lost(X, _).
しかし、今、私たちは新たな問題に遭遇。無敗の(X)を照会すると、ジェイムズ、クレイグ、ジェイムズのソリューションが得られます。これは、ジェイムズが白黒の両方の作品を再生するためですが、クレイグは白い部分のみを再生するためです。だから、問題は無敗です(ジェイムス)は、ホワイトプレーヤ(ジェイムス)とブラックプレーヤ(ジェイムズ)の両方で続行しています。バックトラック中にこれらの1つのみを処理するためにはどうすればいいですか?
データベースに「won/2」と「lost/2」の両方の事実があるのはなぜですか?彼らは重複しており、混乱を招いています。 '(X、Y)'が 'lost(Y、X)'に相当しますか? – lurker
@lurkerはい、それは同等です。残念ながら、私は両者を扱っていません。 – Greg