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.
任务是根据用户输入以“_ 是 _”的形式创建规则。或“一个_是一个_。” 这应该以“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) ?