0

我正在尝试在 Prolog 中编写一个程序,该程序将识别“is a”语句并在查询中应用传递属性。例如:

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).

它不涉及任何情况,它只会说真并在给出声明时终止。我究竟做错了什么?

4

1 回答 1

1

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

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

这是指出该规则与:

begin :- begin(_).

这凸显了Inputin的作用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谓词一起使用。很明显,这里不应该有什么应该是的。Listrules/1

然后你有一个明显的错字:

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

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

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

于 2013-04-29T16:48:09.083 回答