Prolog简单程序
我正在编写一个小的Prolog程序,预计它将执行以下操作:Prolog简单程序,prolog,dcg,Prolog,Dcg,我正在编写一个小的Prolog程序,预计它将执行以下操作: ?-input([allan,is,a,name]). true. ?-input([Is,allan,a,name]). true. 这是我的代码: % Simple answering agent input(Text) :- phrase(sentence(S), Text), perform(S). sentence(statement(S)) --> statement(S). sentence(query
?-input([allan,is,a,name]).
true.
?-input([Is,allan,a,name]).
true.
这是我的代码:
% Simple answering agent
input(Text) :-
phrase(sentence(S), Text),
perform(S).
sentence(statement(S)) --> statement(S).
sentence(query(Q)) --> query(Q).
statement(Statement) -->
[Thing, 'is', 'a', Category],
{ Statement =.. [Category, Thing]}.
query(Query) -->
['Is', Thing, 'a', Category],
{ Query =.. [Category, Thing]}.
perform(statement(S)) :- asserta(S).
perform(query(Q)) :- Q.
输入([is,allan,a,name])。
部分似乎工作正常,但查询部分存在问题,如果我键入输入([is,allan,a,name])。
,它会打印出来
Is = 'Is'
有人能帮我看看这个问题吗,谢谢。好吧,问题是
is
是一个变量,因此prolog会实例化它(使用'is'
)。确保列表中的所有成员都是原子是一种很好的做法,但要快速解决问题,您只需执行以下操作:
query(Query) -->
[_, Thing, 'a', Category],
{ Query =.. [Category, Thing]}.
这样,Is
就不会被实例化,prolog只会说true。唯一的问题是语句可能被解释为查询:
9 ?- input([allan, is, a, name]).
true ;
false.
10 ?- input([is, is, a, name]).
true .
11 ?- input([allan, is, a, name]).
true ;
true.
这可以通过一些切割来修复(或者说东西
应该不同于'is'
——如果可以接受的话)
编辑:对于一个更一般的解决方案:这实际上取决于你想要解析什么样的句子,以及用户可以做出什么妥协。例如,也许可以让他给你一些开场白;如果请求以大写字母开头的单词,他将不得不使用
'
。否则,最好以字符串/原子形式给出它们(“allan是名称”
或“allan是名称”
)。很容易将其分离为单个原子:。对于什么是艾伦
你仍然不需要做什么特别的事情;这是一个3个单词的句子,其余的是4个单词,因此您可以立即将其分开。您好,谢谢您的回答。这是一个很好的解决方法,但是如果我想在这个程序中添加一些其他功能,比如说input([What,is,allan])。
,这个通配符会引起麻烦。你能帮我找到一个更普遍的解决这个问题的方法吗?感谢you@AllanJiang检查我的编辑;然而,解析任何句子的解决方案都很难:p