Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog简单程序_Prolog_Dcg - Fatal编程技术网

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

我正在编写一个小的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(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