如何在不算术且对于A!= B的任何A,B中识别Prolog中的A ^ n B ^ n语言?
已知A = a和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]).
对于任何A和B,我都在考虑从
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
这样第一个元素都是一样的,但是我看不出一种优雅的方式来检查列表其余部分中的所有元素是否都与前面的元素相同和不同。
我可以检查其余部分是否与存储列表一样长,然后检查它是否仅由第二种类型的元素组成,但是我认为问题过于复杂,并且存在一个简短的解决方案。
最佳答案
编辑:回到原始解决方案,并坚持下去:
anbn(List) :- List = [] -> true; List = [A|Rest], a(Rest, A, 0).
a([A|Rest], A, N) :- !, a(Rest, A, s(N)).
a([B|Rest], _, N) :- b(Rest, B, N).
b([B|Rest], B, s(N)) :- b(Rest, B, N).
b([], _, 0).
如果列表中的所有元素都是基于地面的,这是迭代的,不会创建选择点,这很明显,而且是正确的。