【发布时间】:2013-05-07 09:55:04
【问题描述】:
如何在没有算术的情况下识别 Prolog 中的 A^n B^n 语言以及对于 A != B 的任何 A、B?
已知 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
所以第一个元素都是相同的,但是我没有看到一种优雅的方法来检查列表其余部分中的所有元素是否与前面的元素相同和不同。
我可以检查其余的是否与存储的列表一样长,然后检查它是否仅包含第二种类型的元素,但我相信我使问题过于复杂,并且存在一个简短而简单的解决方案。
【问题讨论】:
-
你为什么不使用定句语法?
-
@larsmans 我尝试了一个使用 DCG 的解决方案,但是任意 A 和 B 的要求并且没有算术使得该解决方案并不比普通符号好多少。你能展示你的解决方案吗?
-
我可能错了,但是 a^n b^n 它不是 常规 语言。
-
@Boris:
s --> []. s --> [a], s, [b].然后将两个参数添加到s并对第二条规则进行两个小改动。 (我尽量不泄露答案。) -
@CapelliC:不,不是,为什么?
标签: prolog grammar dcg automata