2017-12-18 14 views
0

私はフォームの文字列を受け入れるためにprologに明確な節の文法を使用しようとしています。ここで、uとは0と1の文字列です。 'u'の0の数は '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],[]). 
...

私は問題は2行目にあるかなり確信しています私はそれを修正する方法を知らない。私は問題が 't'は制約を解決しようとする前にリストを出力していないので動作しないと思っていますが、私は少し固執しています。

+0

[同じ問題についてこの質問]をご覧になることもできます(https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific-数字 - プロローグ)。 – lurker

+0

ああ、素晴らしい、リンクありがとう! –

+0

[同じ桁数の文字列にDCGを書き込む - Prolog](https://stackoverflow.com/questions/47724118/writing-dcg-for-strings-containing-same-number-of-specific-digits)の可能な複製-prolog) –

答えて

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,[])は自分の入力に接続することなく、より長く、より長い配列を生成ということです。

関連する問題