在2个符号a和b的字母{a,b}上定义一个用于回文的dcg,使得a的数量比b的数量少一个。

时间:2013-05-08 22:38:36

标签: prolog palindrome dcg

我正在尝试定义一个回文数,其中a的数量比b的数量少一个。 我似乎无法弄清楚如何正确地写它

   please-->palindromes.
   palindromes-->[].
   palindromes-->[a].
   palindromes-->[b].
   palindromes--> [b],palindromes,[b].

2 个答案:

答案 0 :(得分:0)

想一想:剩余的'b'可以留在哪里?在回文中,只有一个这样的地方。然后更改对称定义,在BNF中(您已经知道翻译为DCG)将读取

S :: P
P :: a P a | b P b | {epsilon}

答案 1 :(得分:0)

你走在正确的轨道上,你只需要一种方法来处理数量上的差异。您可以通过在palindromes语法术语中添加数字参数来完成此操作。

首先,我将定义一个普通的Prolog规则,实现“BA多两个”:

plus2(A,B) :- number(A), !, B is A+2.
plus2(A,B) :- number(B), !, A is B-2.
plus2(A,B) :- var(A), var(B), throw(error(instantiation_error,plus2/2)).

然后我们会说palindromes(Diff)表示给定字母表中的任何回文,其中b个字母的数量减去a个字母的数量为Diff。对于基本案例,您完全了解Diff

palindromes(0) --> [].
palindromes(-1) --> [a].
palindromes(1) --> [b].

对于递归语法规则,我们可以使用{大括号}中的代码块来检查plus2谓词:

palindromes(DiffOuter) --> [b], palindromes(DiffInner), [b],
    { plus2(DiffInner, DiffOuter) }.
palindromes(DiffOuter) --> [a], palindromes(DiffInner), [a],
    { plus2(DiffOuter, DiffInner) }.

要完成,顶级语法规则就是

please --> palindromes(1).