1

我为明确的子句语法编写的一些代码我非常密切地遵循“Learn Prolog Now”一书

lex(the,det(single)).
lex(the,det(plural)).
lex(a,det(single)).
lex(some,det(plural)).
lex(at,det(single)).

lex(student,n(single)).
lex(students,n(plural)).
lex(assignment,n(single)).
lex(assignments,n(plural)).
lex(teacher,n(single)).
lex(teachers,n(plural)).
lex(lecture,n(single)).
lex(lecture,n(plural)).
lex(school,n(single)).
lex(home,n(single)).

lex(does,v(single)).
lex(do,v(plural)).
lex(corrects,v(single)).
lex(correct,v(plural)).
lex(writes,v(single)).
lex(write,v(plural)).
lex(gives,v(single)).
lex(give,v(plural)).

lex(his,pro(single)).
lex(her,pro(single)).
lex(their,pro(plural)).

lex(and,conj).
lex(while,conj).

s--> s, conj, s.
s--> np(X),vp(X).
np(X)--> det(X),n(X);pro(X), n(X).
vp(X)--> v(X), np(X).
vp(X)--> v(X).
det(X)--> [A],{lex(A,det(X))}.
pro(X)--> [A],{lex(A,pro(X))}.
v(X)--> [A],{lex(A,v(X))}.
n(X)--> [A],{lex(A,n(X))}.

以下是我询问上述代码的查询

3 ?- s([the,student,does,his,assignment],[])。错误:超出本地堆栈

我已经尝试重新定位词典,但没有奏效至于语法错误,我编译它时没有任何内容

抱歉,如果我没有写好问题,但我不知道还能说什么,如果您需要有关代码的更多信息,请发表评论,我会尽力回答。

4

1 回答 1

1

问题是 s//0 是递归的。你应该修改第一条规则。例如

s --> p, conj, s.
p --> np(X),vp(X).
...
于 2013-05-14T18:04:19.443 回答