2017-12-18 11 views
0

저는 프롤로그에서 확실한 절 문법을 사용하여 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],[]). 

루프 무한 ...

나는 문제가 두 번째 줄에 확신 하지만 어떻게 수정해야할지 모르겠다. 나는 문제가 제약 조건을 해결하기 전에 목록을 출력하지 않아서 작동하지 않는다고 생각하지만 내가 말했듯이 조금 붙어있다.

+0

[동일한 문제에 대한이 질문]을 (https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific- digits-prolog). – lurker

+0

멋진 아, 링크를 가져 주셔서 감사합니다! –

+0

가능한 [특정 자리수가 같은 문자열에 대해 DCG 작성 - 프롤로그] (https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific-digits) -프롤로그) –

답변

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,[]) 그냥 입력에 대한 연결하지 않고, 더 긴 시퀀스를 생성하는 것입니다.