List Prolog程序-实现规则和列表匹配

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

我正试图用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'),
    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(输入)。开始玛丽是个女孩。错误。不要从最上面调试它。像测试其他程序一样,分别测试每一个部件。如果没有得到预期的结果,请跟踪。