2017-12-18 3 views
0

Ich versuche definitive Satzgrammatiken in Prolog zu verwenden, um Zeichenfolgen der Form u, 2, v zu akzeptieren, wobei u und Strings von Nullen und Einsen sind. Es gibt eine Einschränkung, nach der die Anzahl der Nullen in 'u' der Anzahl der Einsen in 'v' entsprechen muss.Wie fügt man eine Einschränkung zu einer Liste hinzu, die von einer Grammatik mit definitiver Klausel generiert wird?

Ich kann den Interpreter dazu bringen, Zeichenfolgen von u, 2, v zu akzeptieren, aber ich habe Probleme, die Einschränkungen hinzuzufügen.

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). 

Zum Beispiel:

?- t([0,1,1,2,1,0,0],[]). 
    True. 

Je nach Bedarf, aber

?- s([0,1,1,2,1,0,0],[]). 

Loops unendlich ...

Ich bin mir ziemlich sicher, dass das Problem in der zweiten Zeile ist aber ich weiß nicht, wie ich es korrigieren soll. Ich denke, das Problem ist, t 'gibt keine Liste aus, bevor versucht wird, die Beschränkungen zu lösen, so dass es nicht funktioniert, aber wie gesagt, ich bin ein bisschen festgefahren.

+0

Sie können sich [diese Frage zum selben Problem] ansehen (https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-spezific- Ziffern-Prolog). – lurker

+0

ah brilliant, danke für den Link! –

+0

Mögliches Duplikat von [DCG für Zeichenketten schreiben, die die gleiche Anzahl von spezifischen Ziffern enthalten - Prolog] (https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific-digits) -Prolog) –

Antwort

1

Es scheint eine duplicate Frage zu sein, aber ich habe den Code bereits geschrieben.

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 }. 

Ihr Problem ist, dass der Anruf t(Input,[]) erzeugt nur länger und längere Sequenzen, ohne Verbindung zum Eingang.

Verwandte Themen