Prolog 如何向由确定子句语法生成的列表添加约束?

Prolog 如何向由确定子句语法生成的列表添加约束?,prolog,Prolog,我试图在prolog中使用定分句语法来接受形式为u,2,v的字符串,其中u和是0和1的字符串。有一个约束条件,即“u”中的零数必须等于“v”中的一数 我可以让解释器接受u,2,v的字符串,但是我在添加约束时遇到了麻烦 s--> t, {t(Input,[]), find_zeroes(Input,X),length(X,Z), reverse(Input,RevInput),find_ones(RevInput,Y),length(Y,Z)}. t --> [2]. t --&

我试图在prolog中使用定分句语法来接受形式为u,2,v的字符串,其中u和是0和1的字符串。有一个约束条件,即“u”中的零数必须等于“v”中的一数

我可以让解释器接受u,2,v的字符串,但是我在添加约束时遇到了麻烦

s--> t,
{t(Input,[]),
 find_zeroes(Input,X),length(X,Z),
 reverse(Input,RevInput),find_ones(RevInput,Y),length(Y,Z)}.

t --> [2].
t --> l,[2],r.

l --> [X],{member(X,[0,1])}.
l --> [X],l,{member(X,[0,1])}.
r --> [Y],{member(Y,[0,1])}.
r --> [Y],r,{member(Y,[0,1])}.



accfindzeroes([H|T],Acc,Result):- H = 0, accfindzeroes(T,[H|Acc],Result).
accfindzeroes([H|T],Acc,Result):- H \= 0, accfindzeroes(T,Acc,Result).

accfindzeroes([2|_],Acc,Acc).
find_zeroes(List,Result):-accfindzeroes(List,[],Result).


accfindones([H|T],Acc,Result):-  H = 1, accfindones(T,[H|Acc],Result).
accfindones([H|T],Acc,Result):- H \= 1, accfindones(T,Acc,Result).

accfindones([2|_],Acc,Acc).
find_ones(List,Result):-accfindones(List,[],Result).
例如:

    ?- t([0,1,1,2,1,0,0],[]).
    True.
根据需要,但是

    ?- s([0,1,1,2,1,0,0],[]).
无限循环

我很确定问题在第二行,但我不知道如何纠正它。我认为问题在于“t”在尝试解决约束之前没有输出列表,因此它不起作用,但正如我所说,我有点卡住了。

这似乎是个问题,但我已经编写了代码

t --> [2].
t --> l(N),[2],r(N).

l(0) --> [].
l(N) --> [0],l(N0), { N is N0 + 1 }.
l(N) --> [1],l(N).

r(0) --> [].
r(N) --> [0],r(N).
r(N) --> [1],r(N0), { N is N0 + 1 }.

您的问题是调用
t(Input,[])
只会生成越来越长的序列,而与您的输入没有任何连接。

您可能想看看。啊,太棒了,谢谢您的链接!可能重复的