如果你只想查看生成的所有句子,使用以下命令非常方便:
?- length(Xs, N), phrase(mynonterminal, Xs).
当然,这会生成所有句子。但它非常有用,可以节省您考虑具体限制的时间。如果您想进一步限制,请添加目标between(0,10,N)
在前。
如果你想在语法中说某个非终结符应该具有一定的长度,最好明确地说:
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
a --> {length(Es,10)}, seq(Es), {phrase(mynonterminal,Es)}.
如果你仍然不高兴,那么你想表达两个非终结符的交集。这相当于询问两种上下文无关语言的交集,这在一般情况下是不可判定的。但更早的时候,你就会遇到终止问题。因此请注意以下内容:
:- op( 950, xfx, &).
(NT1 & NT2) -->
call(Xs0^Xs^(phrase(NT1,Xs0,Xs),phrase(NT2,Xs0,Xs))).
仅当您不使用时才需要以下内容库(拉姆达):
^(V0, Goal, V0, V) :-
call(Goal,V).
^(V, Goal, V) :-
call(Goal).
因此,现在您可以表达两个非终结符的交集。但请注意,这里的终止非常脆弱。特别是,第一个非终结符的终止不一定限制第二个非终结符。