Parsing 定冠词语法-Prolog

Parsing 定冠词语法-Prolog,parsing,prolog,dcg,Parsing,Prolog,Dcg,下面我有一个明确的子句语法,它应该接受字符串aabccc,但是当我测试语法时,我能接受的唯一字符串是abc 我很确定我已经摆脱了左手递归,所以我不确定出了什么问题 s --> x, y, z. x --> [a], x. x --> [a]. y --> [b], y. y --> [b]. z --> [c], z. z --> [c]. 另外,我能把上面的语法定义为 s --> x, y, z. x --> [a], x; [a].

下面我有一个明确的子句语法,它应该接受字符串
aabccc
,但是当我测试语法时,我能接受的唯一字符串是
abc

我很确定我已经摆脱了左手递归,所以我不确定出了什么问题

s --> x, y, z.
x --> [a], x.
x --> [a].
y --> [b], y.
y --> [b]. 
z --> [c], z.
z --> [c].
另外,我能把上面的语法定义为

s --> x, y, z.
x --> [a], x; [a].
y --> [b], y; [b].
z --> [c], z; [c].

两个版本的语法都能正常工作:

?- phrase(s, [a,a,b,b,c,c,c], R).
R = [] .

?- phrase(s, [a,a,b,b,c,c,c]).
true .
可能问题在于,您试图调用它的不是a
[a,a,b,b,c,c]
令牌列表,而是a
aabccc
atom?如果是这种情况,您可以使用标准的
atom\u chars/2
内置谓词将atom转换为字符列表:

?- atom_chars(aabccc, Tokens).
Tokens = [a, a, b, c, c, c].

以上语法有效。我只需要重新编译它。谢谢:)