Comment reconnaître le langage A^n B^n dans Prolog sans arithmétique et pour tout A, B où A! = B?Reconnaissance du langage A^n B^n dans Prolog sans arithmétique
Avec connu A = A et B = b on pourrait écrire
% For each 'a' save 'b' in a list, then check
% whether constructed list is equal to the rest of input list
anbn(L) :- anbn(L, []).
anbn(L, L).
anbn([a|L],A) :- anbn(L, [b|A]).
Pour tout A et BI Pensais d'une solution en commençant par
anbn(L) :- anbn(L, []).
anbn([H|L],[]) :- anbn(L,[H]). % save an element
anbn([H|L], [H|A]) :- anbn(L, [H,H|A]). % make sure front elements are the same
de sorte que les premiers éléments sont d'autant même chose, mais je ne vois pas une manière élégante de vérifier si tous les éléments dans le reste de la liste sont les mêmes et différents que les éléments sur le devant.
Je pourrais vérifier si le reste est aussi long que la liste stockée et ensuite s'il ne comprend que les éléments de second type mais je crois que je suis trop compliqué et qu'il existe une solution courte et simple.
Pourquoi ne vous utilisez Defin ite clause grammaires? –
@larsmans J'ai essayé une solution avec un DCG mais les exigences de A et B arbitraires et pas d'arithmétique ont rendu la solution pas beaucoup mieux que la notation normale. Pouvez-vous s'il vous plaît montrer votre solution? –
Je peux me tromper, mais a^n b^n ce n'est pas une langue * régulière *. – CapelliC