0

ユーザー入力を受け取り、入力のセマンティクスに基づいて決定を下す Prolog プログラム (基本的にはチャットボット) を作成しようとしています。

私は当初 (ロジック プログラマーではないので)、複数の単語セット (疑問詞、家族語、感情的な内容の良い/悪い単語) をチェックし、使用される単語の種類を説明するアトムをリストに蓄積すると考えていました。 、そのリストと照らし合わせて、何を言うかを決定します。

明らかに、これはうまくいかないので、今はほとんど迷っています。Prologでこのようなことをする方法はありますか、それとも私はそれについてすべて間違っていると考えていますか?

4

4 に答える 4

1

あなたは知っていsetof/3ますか?

結果のセットをリストに収集できます。

setof( Category, is_a(Word, Category), L),
say_something(Word, L), 
....
于 2013-05-02T05:53:08.723 に答える
1

findall を使用する

あなたが持っているとしましょう:

a(「お元気ですか」、「元気です」)。a(「お元気ですか」、「悪くないです」)。

findall( Answer, a( 'お元気ですか', Answer ), Answers )

この場合、回答には項目のリストが含まれます (この場合、「良い」と「悪くない」)

于 2013-05-02T12:47:33.263 に答える
0

ELIZA、もうすぐ 50 回 (!) の誕生日です。私が知っている中で最も有名なチャットボットです。「ELIZA プロローグ ソース」を検索して最初の回答を取得し、データベースをニーズに合わせて調整できます。

于 2013-05-02T05:55:54.103 に答える
0

わかりました私の答えは、リストのアイデアから離れ、代わりに述語を使用することになりました:

maleWords(  [he, him, his]).
femaleWords([she, her, hers]).
familyWords([mother, mom, father, dad, sister, brother]).
goodEmotes( [happy, ecstatic, great, good, yay, love, like, better, best]).
badEmotes(  [sad, bad, horrible, depressed, sucks, death, die, died, dead]).

chat:-writeln('What\'s on your mind?'), bot.
bot:-readln(A),
 maplist(downcase_atom, A, X),
 X \= [quit] ->
    maplist(checkAtom,X,Temp),
    sort(Temp,List),
    wrt(List),
    bot;
 writeln('Fine. Ruin your life then.').

checkAtom(A,X):-
 maleWords(Y),   member(A,Y)-> X = maleW;
 femaleWords(Y), member(A,Y)-> X = femaleW;
 familyWords(Y), member(A,Y)-> X = family;
 goodEmotes(Y),  member(A,Y)-> X = goodEm;
 badEmotes(Y),   member(A,Y)-> X = badEm;
 X = nothing.

wrt(List):-
 sublist([badEm,family,femaleW],List) -> writeln('Do you feel like she\'s causing your problems?');
 sublist([badEm,family,maleW],List) -> writeln('Do you feel like he\'s causing your problems?');
 sublist([family,femaleW,goodEm],List) -> writeln('Do you feel like she\'s helping you?');
 sublist([family,goodEm,maleW],List) -> writeln('Do you feel like he\'s helping you?');
 writeln('Hmm.*writes on clipboard*').

%%%%%%% Got this predicate from another SO question... %%%%%%%%%%
sublist( [], _ ).
sublist( [X|XS], [X|XSS] ) :- sublist( XS, XSS ).
sublist( [X|XS], [_|XSS] ) :- sublist( [X|XS], XSS ).
于 2013-06-24T15:56:53.643 に答える