List Prolog程序-实现规则和列表匹配
我正试图用Prolog编写一个程序,识别“is a”语句,并在inquired中应用传递属性。例如:List Prolog程序-实现规则和列表匹配,list,prolog,List,Prolog,我正试图用Prolog编写一个程序,识别“is a”语句,并在inquired中应用传递属性。例如: Input: Mary is a girl. Output: ok. Input: A girl is a human. Output: ok. Input: Is Mary a human? Output: yes. 这是我的密码: begin :- begin(Input). begin(Input) :- write('Begin.. '), write('\n
Input: Mary is a girl.
Output: ok.
Input: A girl is a human.
Output: ok.
Input: Is Mary a human?
Output: yes.
这是我的密码:
begin :-
begin(Input).
begin(Input) :-
write('Begin.. '),
write('\n'),
readln(Input),
tokenize_atom(Atom, List),
rules(List).
begin.
rules(['A', Subj, is, a, What]) :-
asserta(a(Subj, What)),
write('ok'),
write('\n').
rules([Subj, is, a, What]) :-
asserta(is(Subj, What)),
write('ok'),
write('\n').
rules(['Is', Subj, a, What]) :-
(is(Subj, Z) ; a(Z, What)) -> (write('Yes.'), nl)
; (write('Unknown.'), nl).
它不涉及任何情况,它只会说true,并在给出一个语句时终止。我做错了什么?Prolog本身想帮助您。查看您收到的有用信息:
|: begin :-
|: begin(Input).
Warning: user://1:9:
Singleton variables: [Input]
这表明,这一规则与:
begin :- begin(_).
这突出显示了Input
在begin/1
中的角色不明确。是输入还是输出?如果您可以这样使用它,那么它必须是输出的,这与它在定义中的使用方式是一致的,但是看看您遇到的另一个问题:
|: begin(Input) :-
|: write('Begin.. '),
|: write('\n'),
|: readln(Input),
|: tokenize_atom(Atom, List),
|: rules(List).
Warning: user://1:14:
Singleton variables: [Atom]
原子和列表来自哪里?大概您希望其中一个出现在readln/1
中。这里实际发生的事情是,您要求Prolog输入一个值,然后返回,而不做任何处理;同时,Prolog从无到有地具体化了Atom
和List
,并将它们与规则/1
谓词一起使用。很明显,有些东西没有连接在这里,应该是这样的
然后你有一个明显的打字错误:
|: begin.
Warning: user://1:22:
Clauses of begin/0 are not together in the source-file
我猜你是指规则(列表)
后面的逗号,而不是句号
尝试解决这些问题,看看您是否取得了一些进展。请查看,看看其中是否有帮助。感谢您的快速回复。我解决了这些问题,但仍不符合规定。我给它的任何语句都返回false.?-begin(输入)。开始玛丽是个女孩。错误。不要从最上面调试它。像测试其他程序一样,分别测试每一个部件。如果没有得到预期的结果,请跟踪。