Как распознать язык A^n B^n в Prolog без арифметики и для любых A, B, где A! = B?Признать язык A^n B^n в Prolog без арифметики
С известной А = а и B = B мы могли бы написать
% 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]).
Для любого А и Б. имел в виду решение, начиная с
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
так, что первые элементы являются все То же самое, но я не вижу элегантного способа проверить, все ли элементы в остальном списке одинаковы и отличаются от элементов впереди.
Я мог бы проверить, осталось ли остальное до тех пор, пока сохраняется список, а затем состоит ли он только из элементов второго типа, но я считаю, что я преувеличиваю проблему, и существует короткое и простое решение.
Почему вы не используете defin ite clause грамматики? –
@larsmans Я попробовал решение с DCG, но требования произвольных A и B и без арифметики сделали решение не намного лучше, чем стандартная нотация. Можете ли вы показать свое решение? – 2013-05-07 11:45:45
Возможно, я ошибаюсь, но a^n b^n это не обычный язык. – CapelliC