我为一个明确的子句语法编写了一些代码 我非常仔细地阅读了“现在学习Prolog”一书
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([学生,他,他的,作业],[])。 错误:超出本地堆栈
我已经尝试重新定位词典,但这不起作用 至于语法错误,编译时没有任何东西被提取
很抱歉,如果我没有写好问题,但我不知道还有什么要说的,如果您需要更多关于代码的信息,请发表评论,我会尽力回答。
答案 0 :(得分:1)
问题是s // 0是递归的。你应该修改第一条规则。 例如
s --> p, conj, s.
p --> np(X),vp(X).
...