2017-09-09 60 views
2

我將如何去查找在序言中的列表中找到連續的字符串重複。在列表中查找重複

什麼我究竟試圖找到,例如,是這樣的:

input => output 
AAAAAA => 6*(A) 
ABABAB => 3*(AB) 
ABCABCABC => 3*(ABC) 

我寫了DCG文法這一點,我試圖把它給我這個結果。

這裏的語法,如果需要的話:

exp --> term. 
exp --> term, [+], exp. 

term --> factor. 
term --> digit, [*], exp. 

factor --> elem. 
factor --> ['S'], ['['], sym, [']']. %S[(A)(B),(C)] 
factor --> ['<'], alt, ['>'], ['/'], ['<'], alt, ['>']. %<(A)>/<(B)(C)(D)> 
factor --> ['('], exp, [')']. 

sym --> factor. 
sym --> factor, [','], factor. 
sym --> factor, sym. 

alt --> factor. 
alt --> factor, alt. 

elem --> char. 
elem --> char, elem. 
char --> [D], {is_alnum(D)}. 
digit --> [D], {is_alnum(D)}. 
digit --> [D], {number(D)}. 

nbr_to_char(N, Cs) :- 
    name(Cs, [N]). 
str_to_list(S, Cs) :- 
    name(S, Xs), 
    maplist(nbr_to_char, Xs, Cs). 

eval(L) :- 
    str_to_list(L, X), 
exp(X, []). 

感謝您的幫助。

+0

也許這將是很好的提供語法? –

+0

我沒有發現它是必要的,因爲語法處理的方式比這個更多的情況下,但我會把它放在任何地方。 – CpCd0y

+0

ABCABCAB爲什麼會產生「3 *(ABC)」?你想要什麼'AAABBBAAABBB'導致? – lurker

回答

2

我想你以後是包(dcg_util)。 還要考慮追加/ 2:

?- A=`ababab`. 
A = [97, 98, 97, 98, 97, 98]. 

?- append([X,X,X],$A). 
X = [97, 98], 
A = [97, 98, 97, 98, 97, 98] ; 
false. 

現在,如果我們只是找到一個簡單的方法,使重複的​​變量列表,我們有一個相當強大的構造,我們可以用它來解決問題的。讓我們嘗試:

?- length(L,3),maplist(=(X),L). 
L = [X, X, X]. 

所以:

?- length(L,_),maplist(=(X),L),append(L,$A). 
L = [[97, 98, 97, 98, 97, 98]], 
X = A, A = [97, 98, 97, 98, 97, 98] ; 
L = [[97, 98], [97, 98], [97, 98]], 
X = [97, 98], 
A = [97, 98, 97, 98, 97, 98] ; 
^CAction (h for help) ? abort 
% Execution Aborted 

哎呀,永無止境的故事......就是有點無聊。需要更多的代碼,強化領域知識(裝袋,真的......)

?- length($A,U),between(1,U,N),length(L,N),maplist(=(X),L),append(L,$A). 
U = 6, 
N = 1, 
L = [[97, 98, 97, 98, 97, 98]], 
X = A, A = A, A = [97, 98, 97, 98, 97, 98] ; 
U = 6, 
N = 3, 
L = [[97, 98], [97, 98], [97, 98]], 
X = [97, 98], 
A = A, A = [97, 98, 97, 98, 97, 98] ; 
false. 
+0

我看到了,謝謝你的回答:) 這似乎只適用於只有重複的情況下,我是對嗎? 假設,我有A ='mabcabc',我將如何去找到與A ='abcabc'相同的結果?我應該測試所有子字符串嗎? – CpCd0y

+1

在固定模式中插入跳過列表很容易,可以考慮使用'? - append([_,X,X,X],$ A).',但這不是太容易推廣......您應該嘗試dcg_util包,如果你正在運行SWI。這有點陡峭,但非常值得。 – CapelliC

+0

噢好吧,所以如果想試圖概括這一點,我會在maplist中做這個? – CpCd0y