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

时间:2013-04-29 16:01:41

标签: list prolog

我正在尝试在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).

它没有进入任何一种情况,它只会说真,并在给出一个声明时终止。我做错了什么?

1 个答案:

答案 0 :(得分:1)

Prolog本身想帮助你。看看你得到的有用信息:

|:     begin :-
|:      begin(Input).
Warning: user://1:9:
        Singleton variables: [Input]

这表明此规则与以下内容没有区别:

begin :- begin(_).

这突出表明Inputbegin/1的作用含糊不清。是输入还是输出?如果你可以这样使用它,它必须输出,这与它在定义中的使用方式一致,但看看你遇到的另一个问题:

|:     begin(Input) :-
|:     write('Begin.. '),
|:     write('\n'),
|:     readln(Input),
|:     tokenize_atom(Atom, List),
|:     rules(List).
Warning: user://1:14:
        Singleton variables: [Atom]

AtomList来自哪里?大概你想要其中一个出现在readln/1。实际上这里发生的是你要求Prolog输入一个值,然后你返回,它没有做任何事情;同时Prolog从空中展示AtomList并将其与rules/1谓词一起使用。很明显,这里应该没有东西。

然后你有一个明显的拼写错误:

|:         begin.
Warning: user://1:22:
        Clauses of begin/0 are not together in the source-file

我怀疑你的意思是rules(List)而不是句号后的逗号。

尝试修复这些问题,看看你是否取得了一些进展。