2017-05-29 19 views
3

プロローグを学習していますが、問題が残っています。私は質問と回答システムを作っています。
たとえば、「車の色は青です」と入力します。プログラムは「OK」と言ってその新しいルールを追加するので、「車の色は何ですか?」と尋ねられます。それは青で応答します。
「車の色は緑色です」と答えると、「それはありません」と返信します。 しかし、 "車の色は青です"と入力すると、質問版では真、偽を返します。誰かがどこへ向かうか指示してくれますか?私はどのようにプログラムが「青い」か何かを言うようにする方法を知らない。プロローグのクエリと回答システムの作成

input :- 
    read_line_to_codes(user_input, Input), 
    string_to_atom(Input,Atoms), 
    atomic_list_concat(Alist, ' ', Atoms), 
    phrase(sentence(S), Alist),  
    process(S). 

statement(Statement) --> np(Description), np(N), ap(A), 
{ Statement =.. [Description, N, A]}. 

query(Fact) --> qStart, np(A), np(N), 
{ Fact =.. [A, N, X]}. 


np(Noun) --> det, [Noun], prep. 
np(Noun) --> det, [Noun]. 

ap(Adj) --> verb, [Adj]. 
qStart --> adjective, verb. 

vp --> det, verb. 

adjective --> [what]. 
det --> [the]. 

prep --> [of]. 

verb -->[is]. 


%% Combine grammar rules into one sentence 
sentence(statement(S)) --> statement(S). 
sentence(query(Q)) --> query(Q). 
process(statement(S)) :- asserta(S). 
process(query(Q))  :- Q. 
+0

あなたの質問をトレースして、watが間違っていますか? '? - Query.'の代わりに'? - trace、Query.'と書いて、それを実行してください。しかし、しかし、してください警告を無視しないでください私は彼らがちょうど警告であることを知っているが、警告を無視し、さらにエラーを無視して、あなたがちょうどStackoverflowに来るならば、 –

+0

あなたはいくつかの*シングルトン*可変警告と構文エラーを持っていますので、それらをさらに進める前に解決する必要があります。 – lurker

+0

私は何を変更するべきかわからないので、説明を除いて、エラーを取り出しました。私はその変数は必要ありません。誰か私の元の質問から私を指示することはできますか? – user3277930

答えて

1

あなたは実際には本当に近い。これを見てみましょう:

?- phrase(sentence(Q), [what,is,the,color,of,the,car]). 
Q = query(color(car, _6930)) ; 
false. 

ここで、文を正しく解析しました。今度はそれを処理してみましょう:

?- phrase(sentence(Q), [what,is,the,color,of,the,car]), process(Q). 
Q = query(color(car, 'blue.')) ; 
false. 

ご覧のとおり、正しく統合されています。あなたが終わったときに、あなたはただ何もしなかっただけです。

display(statement(S)) :- format('~w added to database~n', [S]). 
display(query(Q)) :- Q =.. [Rel, N, X], format('the ~w has ~w ~w~n', [N, Rel, X]). 

そしてdisplay/1述語に渡すinput/0を変更します:

input :- 
    read_line_to_codes(user_input, Input), 
    string_to_atom(Input,Atoms), 
    atomic_list_concat(Alist, ' ', Atoms), 
    phrase(sentence(S), Alist),  
    process(S), 
    display(S). 

今、あなたは時にいくつかの結果を得る私はあなたがする必要があるすべては結果を表示するためのものにprocess/1の結果を渡していると思いますあなたはそれを使用します:

?- phrase(sentence(Q), [what,is,the,color,of,the,car]), process(Q), display(Q). 
the car has color blue. 
Q = query(color(car, 'blue.')) ; 
false. 

?- phrase(sentence(Q), [the,siding,of,the,car,is,steel]), process(Q), display(Q). 
siding(car,steel) added to database 
Q = statement(siding(car, steel)) ; 
false. 

?- phrase(sentence(Q), [what,is,the,siding,of,the,car]), process(Q), display(Q). 
the car has siding steel 
Q = query(siding(car, steel)) ; 
false. 
関連する問題