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],[]).
루프 무한 ...
나는 문제가 두 번째 줄에 확신 하지만 어떻게 수정해야할지 모르겠다. 나는 문제가 제약 조건을 해결하기 전에 목록을 출력하지 않아서 작동하지 않는다고 생각하지만 내가 말했듯이 조금 붙어있다.
[동일한 문제에 대한이 질문]을 (https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific- digits-prolog). – lurker
멋진 아, 링크를 가져 주셔서 감사합니다! –
가능한 [특정 자리수가 같은 문자열에 대해 DCG 작성 - 프롤로그] (https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific-digits) -프롤로그) –