input :-
read_line_to_codes(user_input, Input),
string_to_atom(Input,Atoms),
atomic_list_concat(Alist, ' ', Atoms),
phrase(sentence(S), Alist),
action(S).
statement(Rule) --> [Noun, 'is', 'a', Object], { Rule =.. [Object, Noun]}.
statement1(Rule) --> ['A', Noun, 'is', 'a', Object], { Rule =.. [Object, Noun]}.
query(Fact) --> ['Is', Noun, 'a', Object], { Fact =.. [Object, Noun]}.
sentence(statement(S)) --> statement(S).
sentence(statement1(S))--> statement1(S).
sentence(query(Q)) --> query(Q).
action(statement(S)) :- asserta(S) -> write(ok).
action(statement1(S)) :- asserta(S) -> write(ok).
action(query(Q)) :-( Q -> write(yes); write(unknown)), nl.
割り当ては、「_ is a _.」という形式のユーザー入力からルールを作成することです。または「 _ は _ です。」これは「OK」で応答するはずです。
そして、「Is _ a _?」をクエリできるようにします。そして、「はい」または「不明」で応答します。述語(「ハム」と呼ばれるものだと思います)がデータベースにない場合にエラーが発生する理由はわかりませんが、他の部分がそこになくても問題ありません。私が間違っていることについてのアイデアはありますか?そして、プロローグで初めて、単純にばかげたことをしている場合は申し訳ありません。問題がある場合は、SWI-Prolog V.6.2.6 を使用しています。そして、出力で true または false の戻り値を省略するにはどうすればよいでしょうか
11 ?- input.
|: john is a dog
ok
true .
12 ?- input.
|: Is john a dog
yes
true.
13 ?- input.
|: Is abraham a dog
unknown
false.
14 ?- input.
|: Is john a ham
ERROR: action/1: Undefined procedure: ham/1
Exception: (8) ham(john) ?