3

ヒント

4人のゲスト(マスタード大佐、プラム教授、スカーレット嬢、グリーンさん)がボディ氏の家でのディナーパーティーに出席します。突然、ライトが消える!彼らが戻ってきたとき、ボディ氏はテーブルの真ん中で死んで横たわっていました。誰もが容疑者です。さらに詳しく調べると、次の事実が明らかになります。

  • ボディ氏はグリーンさんと浮気をしていた。
  • プラム教授はグリーンさんと結婚しています。
  • ボディ氏はとても裕福でした。
  • マスタード大佐はとても貪欲です。
  • ミス・スカーレットもボディ氏と浮気をしていた。

殺人の動機として考えられるのは、次の 2 つです。

  • 憎しみ: 相手が自分の配偶者と関係を持っている場合、誰かがその人を憎みます。
  • 貪欲:貪欲で金持ちではなく、犠牲者が金持ちであれば、誰かが喜んで殺人を犯します.

パート A: 上記の事実とルールを Prolog プログラムに記述します。人には次の名前を使用します: colMustard、profPlum、missScarlet、msGreen、mrBoddy。結婚のような対称関係をどのようにエンコードするか (またはエンコードしないか) に注意してください。無限ループは必要ありません。married(X,Y) :- married(Y,X) % INFINITE LOOP

?-suspect(Killer,mrBoddy)
Killer = suspect_name_1
Killer = suspect_name_2
etc.

パート B: 被疑者が誰であるか、つまり誰に動機があるかを判断する述語、suspect/2 を書きます。

?-suspect(Killer,mrBoddy)
Killer = unique_suspect.

パート C: データベースに 1 つのファクトを追加して、一意の容疑者を作成します。採点のために削除/追加できるように、ソース コメントにこの行を明確に示してください。

?-suspect(Killer,mrBoddy)
Killer = unique_suspect.

入力するたびに

suspect(Killer,mrBoddy).

私は得る

suspect(Killer,mrBoddy).
Killer = profPlum

行方不明です

Killer = colMustard.

これが私の情報源です。

%8) Clue

%facts

affair(mrBoddy,msGreen).
affair(missScarlett, mrBoddy).
affair(X,Y) :- affair(X,Y), affair(Y,X).

married(profPlum, msGreen).
married(X,Y) :- married(X,Y), married(Y,X).

rich(mrBoddy).
greedy(colMustard).

%rules

hate(X,Y) :- married(X,Spouse), affair(Y,Spouse).
greed(X,Y) :- greedy(X), not(rich(X)), rich(Y).


%suspect

suspect(X,Y):- hate(X,Y).
suspect(X,Y):- greed(X,Y).
4

2 に答える 2

1

問題は、述語の再帰規則ですaffair/2 and married/2。それらを使用しようとすると、簡単に無限ループに陥ります (つまり、スタック メモリが使い果たされるまで)。X が Y と関係がある場合、Y は X と関係があることを表すために、それぞれのケースで異なる述語を使用する必要がありますsuspect/2。これらの新しい述語を呼び出すには、述語の定義を変更する必要もあります。

無限ループが発生する理由をよりよく理解するには、Prolog システムのトレース機能を使用します。試す:

?- trace, suspect(Killer, mrBoddy).

そして一歩一歩進んでください。

于 2013-11-19T00:51:19.530 に答える