我正在尝试在Prolog中编写一个程序,该程序将识别'是'语句并在查询中应用传递属性。例如:
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).
它没有进入任何一种情况,它只会说真,并在给出一个声明时终止。我做错了什么?
答案 0 :(得分:1)
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]
Atom
和List
来自哪里?大概你想要其中一个出现在readln/1
。实际上这里发生的是你要求Prolog输入一个值,然后你返回,它没有做任何事情;同时Prolog从空中展示Atom
和List
并将其与rules/1
谓词一起使用。很明显,这里应该没有东西。
然后你有一个明显的拼写错误:
|: begin.
Warning: user://1:22:
Clauses of begin/0 are not together in the source-file
我怀疑你的意思是rules(List)
而不是句号后的逗号。
尝试修复这些问题,看看你是否取得了一些进展。