Parsing 用DCG解析和生成多级列表结构

Parsing 用DCG解析和生成多级列表结构,parsing,prolog,nested-lists,dcg,Parsing,Prolog,Nested Lists,Dcg,假设我将一个“a列表”称为零个或多个“a”的列表: 假设我想要表示一个“b列表”,一个由零个或多个a列表组成的列表: % bs := [ as, as ] % bs = [ [a,a,a], [a] ] bs --> []. bs --> [A], { phrase(as,A) }, bs. 有没有更惯用的说法,不需要使用大括号从DCG跳出到“普通Prolog”中,只需要调用phrase()再一次?另一种选择,我不认为是更好的,因为它的可读性可能较低,是使用lambd

假设我将一个“a列表”称为零个或多个“a”的列表:

假设我想要表示一个“b列表”,一个由零个或多个a列表组成的列表:

% bs := [ as,      as  ]
% bs  = [ [a,a,a], [a] ]
bs --> [].
bs --> [A], { phrase(as,A) }, bs.

有没有更惯用的说法,不需要使用大括号从DCG跳出到“普通Prolog”中,只需要调用
phrase()
再一次?

另一种选择,我不认为是更好的,因为它的可读性可能较低,是使用lambda表达式定义
bs//0
非终端。使用Logtalk(可以在大多数Prolog系统中运行)或SWI-Prolog(通过
库(yall)
,它实现了Logtalk lambda表达式):

lambda表达式提供对语法规则隐式参数的访问

电话样本:

?- phrase(bs, [[a],[a,a,a],[a,a]]).
true.

?- phrase(bs, [[a],[a,b,a],[a,a]]).
false.
bs --> [].
bs --> [[A|As],As]>>phrase(as,A), bs.
?- phrase(bs, [[a],[a,a,a],[a,a]]).
true.

?- phrase(bs, [[a],[a,b,a],[a,a]]).
false.