4

私はゲス・フーを開発していますか?プロローグを使ったゲーム。ゲームの仕組みはとても簡単です。プレイヤー (この場合は人間) が、考えられる多くの人物の中から 1 人を選び、もう 1 人のプレイヤー (コンピューター) が、その人物の属性について yes/no の質問を開始します。最終的に、与えられた答えでは、可能な人は1人だけになります。

ここまでで、これまでに出された質問に基づいてコンピューターが人物を推測できるように、一連のルールと述語を作成できました。私には一連の容疑者がいます - それらは、利用可能な手がかりがあれば、適合する可能性のある人々です.

suspect('Person 1') :- eyes(blue) , age(old) , gender(male).

属性の述語は、その属性に関する質問がまだ行われていない場合、または質問が行われ、回答が容疑者の属性と一致する場合に真になるように定義されています。

gender(X) :- not(asked_gender) ; value_of(gender, X).

そうすれば、2 人の容疑者が同じ目と年齢を共有し、性別が異なる場合、性別が問われない限り、どちらももっともらしい容疑者になります。

ただし、現在難しいのは、これらの質問をするプロセスを自動化することです。基本的に、テーマを別の場所にリストするのではなく、プロローグが容疑者の述語から属性の可能な値を取得できるソリューションを楽しみにしています。プロローグがプログラムのコードをデータ自体として使用できることを考えると、これを行う方法があるに違いないと確信しています。

どうすればそれができますか?

4

2 に答える 2

3

これは SWI-Prolog で動作します:

:- dynamic value/1.

suspect('Person 1') :- eyes(blue) , age(old) , gender(male).

suspect('Person 2') :- eyes(green) , age(young) , gender(male).

suspect('Person 3') :- eyes(brown) , age(young) , gender(male).


fetch(Criterion, Value) :-
    retractall(value(_)),
    assert(value([])),
    forall(clause(suspect(_), Body),
    check(Body, Criterion)),
    retract(value(Value)).

check((F, T), Criterion) :-
    F =..[Criterion, V1],
    retract(value(V2)),
    (   member(V1, V2) -> V3 = V2; V3 = [V1 | V2]),
    assert(value(V3)).
    check(T, Criterion).


check((_F, T), Criterion) :-
    check(T, Criterion).

check((F), Criterion) :-
    F =..[Criterion, V1],
    retract(value(V2)),
    (   member(V1, V2) -> V3 = V2; V3 = [V1 | V2]),
    assert(value(V3)).

check((_F), _Criterion).

例: ?- fetch(性別、値)。値 = [男性]。

?- フェッチ (目、値)。値 = [茶、緑、青]。

于 2012-05-13T21:49:18.383 に答える
0

さて、私は次のような構造を想像します:

go :-
    findall(People,suspect(People),SuspectList),
    length(SuspectList,1),
    member(Perb,SuspectList),
    write('It is '),write(Perb),write('!!'),nl,!.

go :-
    askQuestion,
    go.

askQuestion/0 では、read/1 述語を使用して質問し、assert/1 で回答を返します。これは、「インテリジェント」にするか、さまざまな質問を繰り返すことができる場所です。

于 2012-05-12T20:52:31.353 に答える