如何将约束添加到由明确的子句语法生成的列表中?

时间:2017-12-18 18:42:33

标签: prolog

我正在尝试在prolog中使用明确的子句语法来接受u,2,v形式的字符串,其中u是0和1的字符串。存在约束,其中'u'中的零的数量必须等于'v'中的1的数量。

我可以让解释器接受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'在尝试解决约束之前没有输出列表所以它不起作用但是我说我有点卡住了。

1 个答案:

答案 0 :(得分:1)

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

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,[])只会生成越来越长的序列,而与您的输入没有任何关联。